文章目录
- 1、工厂方法模式介绍
- 2、工厂方法模式的定义
- 3、使用场景
- 4、模式的简单实现
1、工厂方法模式介绍
工厂方法模式(Factory Pattern ),是创建型设计模式之一。工厂方法模式是一个结构比较简单的模式。
2、工厂方法模式的定义
就是一个用于创建对象的接口,让子类来决定实体化那个类。
3、使用场景
在任何需要生成复杂对象的地方,都可以使用工厂模式。
4、模式的简单实现
我们以生活中一个例子来说明:
一个汽车厂主要的组装某款SUV车型,有Q3, Q5, Q7, 对于这类车内部结构差异性并不是很大。
因此一条生产线足以应对这3种车型,对于该类生产线工厂提供了一个抽象类定义。
public abstract class AudiFactory {
//某车型的工厂方法
// clz 具体的suv 型号
//return 具体的suv 对象
public abstract <T extends AudiCar> T createAudiCar (Class<T> clz);
}
工厂的3中suv 车型可能在主结构上并没有什么差异,因此并没有什么必要为每一种车型都提供一条不同的生产线即可:
//为相似车型设置 同一条生产线
public class AudiCarFactory extends AudiFactory {
@Override
public <T extends AudiCar> T createAudiCar(Class<T> clz) {
AudiCar car = null;
try {
car = (AudiCar) Class.forName(clz.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) car;
}
}
定义车的基本功能的 类
//相似车型的基本构成 汽车的抽象产品类
public abstract class AudiCar {
public AudiCar () {}
//定义汽车的一个行为方法, 车可以行走
public abstract void drive();
//定义汽车可以自动巡航
public abstract void selfNavigation();
}
接下来定义每种具体的车型
//生产具体车型
public class AudiQ3 extends AudiCar {
@Override
public void drive() {
System.out.println("Q3 启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q3 开始自动巡航了");
}
}
public class AudiQ5 extends AudiCar {
@Override
public void drive() {
System.out.println("Q5 启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q5 开始自动巡航了");
}
}
public class AudiQ7 extends AudiCar {
@Override
public void drive() {
System.out.println("Q7 启动了");
}
@Override
public void selfNavigation() {
System.out.println("Q7 开始自动巡航了");
}
}
最后我们将各种类组装起来形成一条完整的流水线。
public class ClientClass {
public static void main(String[] args) {
//构造一个制造汽车工厂的工厂对象
AudiFactory factory = new AudiCarFactory();
//生产 Q3 并启动
AudiQ3 audiQ3 = factory.createAudiCar(AudiQ3.class);
audiQ3.drive();
audiQ3.selfNavigation();
//生产 Q5 并启动
AudiQ5 audiQ5 = factory.createAudiCar(AudiQ5.class);
audiQ5.drive();
audiQ5.selfNavigation();
//生产 Q7 并启动
AudiQ7 audiQ7 = factory.createAudiCar(AudiQ7.class);
audiQ7.drive();
audiQ7.selfNavigation();
}
最后输出结果如下:
Q3 启动了
Q3 开始自动巡航了
Q5 启动了
Q5 开始自动巡航了
Q7 启动了
Q7 开始自动巡航了
(自己在studio上运行,没有实现 ,出现 bug :
10-12 15:27:29.835 21457-21457/com.example.menglux.factorymode W/System.err: java.lang.InstantiationException: can’t instantiate class com.example.menglux.factorymode.ClientActivity$AudiQ3; no empty constructor
)
在此只做思路整理
工厂模式,简单一点,就是将相同类型的类,通过一个接口来实现 对象的实例化,而不是通过 new.
文献参考:
Android 源码设计模式解析与实战 第二版
本人郑重声明,本博客所编文章、图片版权归权利人持有,本博只做学习交流分享所用,不做任何商业用途。访问者可將本博提供的內容或服务用于个人学习、研究或欣赏,不得用于商业使用。同時,访问者应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人的合法权利;如果用于商业用途,须征得相关权利人的书面授权。若文章、图片的原作者不愿意在此展示內容,请及时通知在下,將及时予以刪除。