设计模式-抽象工厂模式(Abstract Factory Pattern)

设计模式-抽象工厂模式(Abstract Factory Pattern)

   概要

   记忆关键词:抽象接口

   定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。

   分析:如果待创建的产品非常多,我们不需要为每一个产品类配上一个工厂类,而是可以把这些产品进行分组。抽象工厂模式是一种把产品类分组,组内不同产品对象由同一个工厂类不同方法来创建设计模式。

   抽象工厂模式结构图如下: 

   一、能解决什么问题

  抽象工厂模式使得在产品族和产品变体之间切换变得简单。例如,一个图形应用程序可以轻松地从一个主题(如深色主题)切换到另一个主题(如浅色主题)而无需修改客户端代码,只需切换工厂实例即可

   二、涉及的角色
   1. 抽象接口 

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

public interface PC {
    void make();
}


public interface Phone {
    void make();
}

   2. 具体实现类

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

 1 public class MiPC implements PC{
 2     public MiPC() {
 3         this.make();
 4     }
 5     @Override
 6     public void make() {
 7         // TODO Auto-generated method stub
 8         System.out.println("make xiaomi PC!");
 9     }
10 }
11 
12 
13 public class MAC implements PC{
14     public MAC() {
15         this.make();
16     }
17     @Override
18     public void make() {
19         // TODO Auto-generated method stub
20         System.out.println("make MAC!");
21     }
22 }
23 
24 public class Iphone implements Phone {
25     public Iphone() {
26         this.make();
27     }
28 
29     @Override
30     public void make() {
31         // TODO Auto-generated method stub
32         System.out.println("make iphone!");
33     }
34 }
35 
36 public class MiPhone implements Phone {
37     public MiPhone() {
38         this.make();
39     }
40 
41     @Override
42     public void make() {
43         // TODO Auto-generated method stub
44         System.out.println("make xiaomi phone!");
45     }
46 }

   3. 工厂类接口(包含创建不同类型产品的方法)

1 public interface AbstractFactory {
2 
3     Phone makePhone();
4 
5     PC makePC();
6 
7 }

   4.  工厂类子类(按照产品分组)

 1 public class AppleFactory implements AbstractFactory{
 2     @Override
 3     public Phone makePhone() {
 4         return new Iphone();
 5     }
 6     @Override
 7     public PC makePC() {
 8         return new MAC();
 9     }
10 }
11 
12 public class XiaoMiFactory implements AbstractFactory{
13     @Override
14     public Phone makePhone() {
15         return new Iphone();
16     }
17     @Override
18     public PC makePC() {
19         return new MAC();
20     }
21 }

   5.  客户端类Client

 1 public class Client {
 2     public static void main(String[] args) {
 3         AbstractFactory miFactory = new XiaoMiFactory();
 4         AbstractFactory appleFactory = new AppleFactory();
 5         miFactory.makePhone();            // make xiaomi phone!
 6         miFactory.makePC();                // make xiaomi PC!
 7         appleFactory.makePhone();        // make iphone!
 8         appleFactory.makePC();            // make MAC!
 9     }
10 }

   三、优缺点分析

   1.  优点

   1)便于交换产品系列,由于具体工厂类在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。

   2)它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户代码中。

   2. 缺点

   如果需求来自增加功能,除了需要增加功能类接口和具体功能实现类,还需要改动相关的工厂类,这就非常糟糕了

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

   1. 简单工厂模式

   简单工厂模式有唯一的工厂类,工厂类的创建方法根据传入的参数做if-else条件判断,决定最终创建什么样的产品对象。

   2. 工厂方法模式

   工厂方法模式由多个工厂类实现工厂接口,利用多态来创建不同的产品对象,从而避免了冗长的if-else条件判断。

   3. 抽象工厂模式

   抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。

   改进:
   用简单工厂来改进抽象工厂,使用反射,通过配置文件来实现

posted @ 2024-07-24 14:08  欢乐豆123  阅读(6)  评论(0编辑  收藏  举报