0x00 为什么需要工厂模式
使用工厂模式的目的是使得
对象的创建和使用分离
。一个对象的职责有三种,对象本身所具有的职责,创建对象的职责,使用对象的职责。
0x01 简单工厂模式
是其他两个工厂模式的基础。
- 简单工厂定义:根据参数的不同返回不同的具体类的实例,创建的实例通常具有共同的父类。创建实例的方法是静态的,所以也叫静态工厂模式。
- 优点:简化创建对象实例的步骤;使用配置文件,在不修改任何客户端代码的情况下更换和增加新具体产品类。
- 缺点:系统扩展困难,一旦添加新产品就不得不修改工厂逻辑。如果具体产品类过多,会使得工厂类过于庞大。
- 适用场景:工厂类负责的对象不多,不会造成工厂方法中的业务逻辑太过复杂。客户端不关心创建对象的过程。
典型模板1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16class XXXFactory {
//静态工厂方法
public static Chart getChart(String type) {
XXX x = null; //XXX为父类
if (type.equals("x1")) {
chart = new XXX1();
}
else if (type.equals("x2")) {
chart = new XXX2();
}
else if (type.equals("x3")) {
chart = new XXX3();
}
return chart;
}
}
0x10 工厂方法模式
工厂方法模式中包含如下几个角色。
- Product(抽象产品):它是定义产品的接口,是产品对象的公共父类。
- ConcreteProduct(具体产品):它实现了抽象产品接口,
具体工厂和具体产品之间一一对应
。 - Factory(抽象工厂):声明了工厂方法,用于返回一个产品。抽象工厂是工厂方法模式的核心。
- ConcreteFactory(具体工厂):实现了抽象工厂中定义的工厂方法,由客户端调用,返回具体产品类的实例。
- 优点:客户端无需知道具体产品类,只需知道具体工厂类;加入新产品时,无需改动原有代码,只要添加一个具体工厂和具体产品。
- 缺点:加入新产品时,需要同时真假工厂和产品两个类,造成相识代码过多。
- 适用场景:客户端不知道它所需要的对象的类。抽象工厂类通过其子类来指定创建哪个对象。
0x11 抽象工厂模式
抽象工厂模式为
创建一组对象
提供了一种解决方案。而工厂方法是创建一种产品
。
- 在抽象工厂中声明了
多个工厂方法
,用于创建不同类型的产品,抽象工厂可以是接口,也可以是抽象类或者具体类。 - 抽象工厂模式中,增加新的产品族很方便,但是增加新的产品等级结构很麻烦。
(1) 产品等级结构:产品等级结构即产品的继承结构,如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
(2) 产品簇:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中,海尔电视机、海尔电冰箱构成了一个产品族。
- 优点:增加新的产品族很方便。
- 缺点:增加新的产品等级结构麻烦。
- 适用场景:系统中有多于一个的产品族,而每次只使用其中某一产品族。产品等级结构稳定,设计完成之后,不会向系统中增加新的产品等级结构或者删除已有的产品等级结构。