1、优点
(1)良好的封装性、代码结构清晰。
如一个调用者想创建一个对象,只需要知道其名称即可,降低了模板间的耦合。
(2)扩展性好。
如果想增加一个产品,只需扩展一个工厂类即可。
(3)屏蔽产品类
调用者只关心产品的接口。
(4)典型的解耦框架
2、缺点
每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。
三、工厂方法模式的应用
1、何时使用
不同条件下创建不用实例时。方法是让子类实现工厂接口。
2、使用场景
(1)需要生成对象的地方。
(2)需要灵活的、可扩展的框架。
(3)数据库访问、数据库可能变化时。
3、应用实例
(1) 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。
(2)hibernate换数据库只需换方言和驱动即可。
(3)简单计算器的实现。
四、《Head First 设计模式》读后感
1、定义了一个创建对象的接口,但由子类决定实例化的类是哪一个,工厂方法将类的实例化推迟到子类。
2、利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。整个工厂方法模式就是通过子类来创建对象,只负责将客户从具体类型中解耦。
五、代码实例
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9pbWFnZXMyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTE1NzY4
《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》
【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享
My8yMDE4MDYvMTE1NzY4My0yMDE4MDYyNDE0NDc1NDY3NC0xNjcwMjUyNzk0LnBuZw?x-oss-process=image/format,png)
1、Factory类
package designMode.factory;
public abstract class Factory {
public abstract Product createProduct(String owner);
public abstract void registerProduct(Product p);
public abstract void getAllProductOwner();
public Product create(String owner){
Product p = createProduct(owner);
registerProduct§;
return p;
}
}
2、IDCardFactory类
package designMode.factory;
import java.util.ArrayList;
import java.util.List;
public class IDCardFactory extends Factory {
List owners = new ArrayList();
public Product createProduct(String owner){
System.out.println(“为 “+owner+” 创造产品成功…”);
return new IDCardProduct(owner);
}
@Override
public void registerProduct(Product p) {
String owner=((IDCardProduct)p).getOwner();
owners.add(owner);
System.out.println(“注册 “+owner+” 的产品成功…”);
}
@Override
public void getAllProductOwner() {
for(int i=0;i<owners.size();i++){
System.out.println(“产品用户:”+owners.get(i));
}
}
}
3、抽象类
package designMode.factory;
public abstract class Product {
public abstract void use();
}
4、 具体实现类
package designMode.factory;
public class IDCardProduct extends Product {
String owner;
public IDCardProduct(String owner) {
this.owner = owner;
}