当前位置:   article > 正文

【源码分析设计模式 3】JDK中的工厂模式

【源码分析设计模式 3】jdk中的工厂模式

一、基本介绍

工厂二字想必大家都不陌生,工厂就是用来建造东西的,我们市面上买的东西比如水杯、玩具、汽车等等都是从工厂生产的,那我们需不需要知道它们是如何生产出来的呢?当然不需要,商家从工厂中直接提货,我们就可以购买了,完全不知道它是如何生产的,这就是工厂方法模式。

工厂方法模式(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法模式使一个类的实例化延迟到其子类。

给我的感觉就像武侠剧中的万剑归宗,一生十、十生百、万剑不离其宗、万法归一。

二、工厂方法模式的优缺点

1、优点

(1)良好的封装性、代码结构清晰。

如一个调用者想创建一个对象,只需要知道其名称即可,降低了模板间的耦合。

(2)扩展性好。

如果想增加一个产品,只需扩展一个工厂类即可。

(3)屏蔽产品类

调用者只关心产品的接口。

(4)典型的解耦框架

2、缺点

每增加一个产品,就需要增加一个产品工厂的类,增加了系统的复杂度。

三、工厂方法模式的应用

1、何时使用

不同条件下创建不用实例时。方法是让子类实现工厂接口。

2、使用场景

(1)需要生成对象的地方。

(2)需要灵活的、可扩展的框架。

(3)数据库访问、数据库可能变化时。

3、应用实例

(1) 需要一辆汽车,直接从工厂里面提货,不用去管这辆车是怎么做出来的。

(2)hibernate换数据库只需换方言和驱动即可。

(3)简单计算器的实现。

四、《Head First 设计模式》读后感

1、定义了一个创建对象的接口,但由子类决定实例化的类是哪一个,工厂方法将类的实例化推迟到子类。

2、利用工厂方法创建对象,需要扩展一个类,并覆盖它的工厂方法。整个工厂方法模式就是通过子类来创建对象,只负责将客户从具体类型中解耦。

五、代码实例

1、Factory类

  1. package designMode.factory;
  2. public abstract class Factory {
  3. public abstract Product createProduct(String owner);
  4. public abstract void registerProduct(Product p);
  5. public abstract void getAllProductOwner();
  6. public Product create(String owner){
  7. Product p = createProduct(owner);
  8. registerProduct(p);
  9. return p;
  10. }
  11. }

 2、IDCardFactory类

  1. package designMode.factory;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. public class IDCardFactory extends Factory {
  5. List owners = new ArrayList();
  6. public Product createProduct(String owner){
  7. System.out.println("为 "+owner+" 创造产品成功...");
  8. return new IDCardProduct(owner);
  9. }
  10. @Override
  11. public void registerProduct(Product p) {
  12. String owner=((IDCardProduct)p).getOwner();
  13. owners.add(owner);
  14. System.out.println("注册 "+owner+" 的产品成功...");
  15. }
  16. @Override
  17. public void getAllProductOwner() {
  18. for(int i=0;i<owners.size();i++){
  19. System.out.println("产品用户:"+owners.get(i));
  20. }
  21. }
  22. }

3、抽象类 

  1. package designMode.factory;
  2. public abstract class Product {
  3. public abstract void use();
  4. }

4、 具体实现类

  1. package designMode.factory;
  2. public class IDCardProduct extends Product {
  3. String owner;
  4. public IDCardProduct(String owner) {
  5. this.owner = owner;
  6. }
  7. @Override
  8. public void use() {
  9. System.out.println("用户 "+owner+" 正在使用产品...");
  10. }
  11. public String getOwner() {
  12. return owner;
  13. }
  14. }

 5、测试类

  1. package designMode.factory;
  2. public class FactoryMain {
  3. public static void main(String[] args) {
  4. Factory f = new IDCardFactory();
  5. Product p=f.create("江疏影");
  6. p.use();
  7. System.out.println("--------------------");
  8. p=f.create("邱淑贞");
  9. p.use();
  10. System.out.println("--------------------");
  11. f.getAllProductOwner();
  12. }
  13. }

6、控制台输出

至此我们可以看到在工厂抽象类里面定义了创造产品和注册产品,然后在实现类里面真的进行创造和注册产品。

对于抽象类,必须有构造函数,因为子类的初始化需要先调用抽象类的构造函数,然后是子类的构造函数;但是抽象类的构造函数不能定义成抽象的,因为如果这样的话,将不能被实现,因此没有抽象的构造函数。

六、JDK中的工厂模式

七、总结

工厂模式使用了继承、接口、抽象等机制,和之前写的迭代器模式、模板模式都是一样的,可以看出设计模式并不是独立的,而是相互之间有关系和区别的,在学习的时候我们要善于总结设计模式之间的共同之处和不同之处,活学活用,才能在以后的大型项目中选择正确的开发方式,事半功倍。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/63427
推荐阅读
相关标签
  

闽ICP备14008679号