📄 d_factory.java
字号:
/*
1、工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:如何创建及如何向客户端提供。
2、FACTORY METHOD—请MM去麦当劳吃汉堡,不同的MM有不同的口味,要每个都记住是一件烦人的事情,我一般采用Factory Method模式,带着MM到服务员那儿,说“要一个汉堡”,具体要什么样的汉堡呢,让MM直接跟服务员说就行了。
对比:Abstract Factory需要处理的是“一系列相互依赖”的产品的创建,即抽象工厂创建的是一组产品;而Factory Method需要处理的单个产品的创建工作。
当一个类不知道他所必需创建对象的类或一个类希望有子类指定他所创建的类型时(也就是说一个类中的某个对象需要由子类来创建时),此时我们使用Factory Method;
当系统有多于一个的产品组合,而系统只需要使用其中某一产品组合,此时我们一般使用Abstract Factory;
工厂方法模式:核心工厂类不再负责所有产品的创建,而是将具体创建的工作交给
子类去做,成为一个抽象工厂角色,仅负责给出具体工厂类必须实现的接口,而不
接触哪一个产品类应当被实例化这种细节。
实现要点
1、抽象工厂将产品对象的创建延迟到它的具体工厂的子类。
2、如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以。
3、系列对象指的是这些对象之间有相互依赖、或作用的关系,例如游戏开发场景中的“道路”与“房屋”的依赖,“道路”与“地道”的依赖。
4、抽象工厂模式经常和工厂方法模式共同组合来应对“对象创建”的需求变化。
5、通常在运行时刻创建一个具体工厂类的实例,这一具体工厂的创建具有特定实现的产品对象,为创建不同的产品对象,客户应使用不同的具体工厂。
6、把工厂作为单件,一个应用中一般每个产品系列只需一个具体工厂的实例,因此,工厂通常最好实现为一个单件模式。
7、创建产品,抽象工厂仅声明一个创建产品的接口,真正创建产品是由具体产品类创建的,最通常的一个办法是为每一个产品定义一个工厂方法,一个具体的工厂将为每个产品重定义该工厂方法以指定产品,虽然这样的实现很简单,但它确要求每个产品系列都要有一个新的具体工厂子类,即使这些产品系列的差别很小。
*/
/*
* SessionFactory说明工厂的作用。抽象工厂描述加工过程
*/
import java.util.*;
public class D_factory{
public static void main(String[] args) {
Factory factory = new IDCardFactory();
Product card1 = factory.create("結城浩");
Product card2 = factory.create("戶村");
Product card3 = factory.create("佐藤花子");
card1.use();
card2.use();
card3.use();
}
}
abstract class Factory {
public final Product create(String owner) {
Product p = createProduct(owner);
registerProduct(p);
return p;
}
protected abstract Product createProduct(String owner);
protected abstract void registerProduct(Product product);
}
class IDCardFactory extends Factory {
private Vector owners = new Vector();
protected Product createProduct(String owner) {
return new IDCard(owner);
}
protected void registerProduct(Product product) {
owners.add(((IDCard)product).getOwner());
}
public Vector getOwners() {
return owners;
}
}
abstract class Product {
public abstract void use();
}
class IDCard extends Product {
private String owner;
IDCard(String owner) {
System.out.println("建立" + owner + "的卡。");
this.owner = owner;
}
public void use () {
System.out.println("使用" + owner + "的卡。");
}
public String getOwner() {
return owner;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -