抽象工厂模式——java设计模式(四)

简介

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或者相互依赖对象的接口,而无须指定它们具体的类。

  • 工厂方法模式中存在大量的工厂类,会增加系统的开销。需要一个工厂可以创建多个产品对象。
  • 抽象工厂模式面向多个产品等级结构(产品继承结构,抽象产品父类和对应的一系列具体产品),其中的具体工厂负责创建一个产品族(同一个工厂中位于不同产品等级结构的一组产品)。

结构和实现

  • 角色包括:
    • 抽象工厂:声明创建一个产品族的方法,一个方法生产一个产品,每一个产品都位于某个产品等级结构。
    • 具体工厂:实现抽象工厂,创建具体产品。
    • 抽象产品:为每一个产品等级结构声明接口,包含业务方法接口。
    • 具体产品:实现抽象产品。
  • 结构。
    180505.abstractfactory.png
  • 抽象工厂模式也可以提供一组重载的工厂方法,类似工厂方法模式

实例

  • 开发一套界面皮肤库,不同皮肤风格提供效果不同的按钮、文本框、组合框等元素,春天风格提供绿色元素,夏天风格提供蓝色元素。需要良好的扩展性,用户可以自由选择皮肤,开发人员可以在不修改代码的前提下增加皮肤。
  • 界面皮肤库结构。
    180505.skin.png
  • 客户端调用。
public class Client {  
    public static void main(String args[]) {  
        SkinFactory factory;  
        Button bt;  
        TextField tf;  
        ComboBox cb;  
        factory = (SkinFactory)XMLUtil.getBean();  //根据配置文件和反射获得
        bt = factory.createButton();  
        tf = factory.createTextField();  
        cb = factory.createComboBox();  
        bt.display();  
        tf.display();  
        cb.display();  
    }  
}  

开闭原则倾斜性

  • 抽象工厂模式中,增加新的产品族很容易,只需要增加新的具体产品和对应的具体工厂类。增加新的产品等级结构很难,需要修改抽象工厂并逐个修改具体工厂,添加创建产品的工厂方法。
  • 这是一种倾斜式的满足开闭原则。

优缺点和适用环境

  • 优点:
    • 实现对象的创建和使用分离。客户端不知道什么被创建,更换工厂很容易。
    • 产品族关系紧密。保证客户端只是用相同产品族的产品。
    • 增加新的产品族容易
  • 缺点:
    • 增加新的商品等级结构很难
  • 适用环境:
    • 用户无须关系产品类的创建过程。
    • 系统中有超过一个产品族,且每次由于约束条件,只是同时使用某一族产品。
    • 产品结构稳定,设计完成之后只增减新的产品族而不会增减新的产品等级结构。

jdk中的应用

  • java.sql包中数据库connection创建3种statement。
    • 产品等级结构有:Statement,PreparedStatement,CallableStatement。
    • 产品族有:mysql的Connection和C3P0ProxyConnection。
  • 180505.javasql.png

猜你喜欢

转载自blog.csdn.net/qq_40369829/article/details/80205410