设计模式-工厂方法模式(Factory Method Pattern)

设计模式-工厂方法模式(Factory Method Pattern)

   概要

   记忆关键词:子类决定实例化

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

   分析:

   工厂方法模式结构图如下:

   

 

   一、能解决什么问题?

   二、涉及的角色

   1. 抽象接口

   统一的抽象类,代码示例:

1 public interface Phone {
4     void make();
7 }

   2. 具体实现类

   实现接口的具体功能实现类,代码示例:

 1 public class Iphone implements Phone{
 2     public Iphone() {
 3         this.make();
 4     }
 5 
 6     @Override
 7     public void make() {
 8         // TODO Auto-generated method stub
 9         System.out.println("make iphone!");
10     }
11 }
12 
13 
14 public class MiPhone implements Phone{
15     public MiPhone() {
16         this.make();
17     }
18 
19     @Override
20     public void make() {
21         // TODO Auto-generated method stub
22         System.out.println("make xiaomi phone!");
23     }
24 }

   3. 工厂类接口

1 public interface AbstractFactory {
5     Phone makePhone();
9 }

   4. 工厂类子类

 1 public class AppleFactory implements AbstractFactory{
 2     @Override
 3     public Phone makePhone() {
 4         return new Iphone();
 5     }
 6 }
 7 
 8 
 9 public class XiaoMiFactory implements AbstractFactory{
10     @Override
11     public Phone makePhone() {
12         return new MiPhone();
13     }
14 }

  客户端类:

1     public static void main(String[] args) {
2         AbstractFactory miFactory = new XiaoMiFactory();
3         AbstractFactory appleFactory = new AppleFactory();
4         miFactory.makePhone();            // make xiaomi phone!
5         appleFactory.makePhone();        // make iphone!
6     }

   三、优缺点分析

   1.  优点

   工厂方法克服了简单工厂违背了开放-封闭原则的缺点,又保持了封装对象创建过程的优点

   集中封装了对象的创建,使得更换对象时,不需要做大的改动就可以实现,降低了客户程序与产品对象的耦合

   2. 缺点

  每增加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

   四、工厂方法模式和简单工厂模式的区别

   以计算器为例,先通过两者的UML类图看下区别

   简单工厂UML结构图:

    工厂方法UML结构图:

  

     

 

   工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

   工厂方法模式中,每一个子类对对应一个工厂子类,利用多态特性动态创建对象。

   工厂方法模式实现时,客户端需要决定实例化哪一个工厂来生成实例,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。

   如果要添加功能,本来是要改工厂类的,而现在是修改客户端。

   和简单工厂模式中工厂负责生产所有产品相比,工厂方法模式将生成具体产品的任务分发给具体的产品工厂

   五、客户端选择判断的问题

   利用反射可以避免客户端分支判断的问题

posted @ 2020-04-07 23:18  欢乐豆123  阅读(287)  评论(0编辑  收藏  举报