设计模式-抽象工厂模式(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. 抽象工厂模式
抽象工厂模式把产品子类进行分组,同组中的不同产品由同一个工厂子类的不同方法负责创建,从而减少了工厂子类的数量。
改进:
用简单工厂来改进抽象工厂,使用反射,通过配置文件来实现