• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
陌上韶光
学习。学习。学习
博客园    首页    新随笔    联系   管理    订阅  订阅
设计模式之抽象工厂模式

简介:

抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

 抽象工厂(Abstract Factory)模式,又称工具箱(Kit 或Toolkit)模式。

一个具体工厂创建一个产品族,一个产品族是不同系列产品的组合,产品的创建的逻辑分在在每个具体工厂类中。所有的具体工厂继承自同一个抽象工厂。
客户端创建不同产品族的工厂,产品族的工厂创建具体的产品对客户端是不可见的。
增加新的产品族时,需要增加具体工厂类,符合OCP原则。
增加新产品时,需要修改具体工厂类和增加产品类,不符合OCP(开闭原则)
如果没有应对“多系列对象创建”的需求变化,则没有必要使用抽象工厂模式,这时候使用简单的静态工厂完全可以。

    1. //抽象产品类  
    2. public abstract class AbstractProductA {     
    3.      //每个产品共有的方法  
    4.      public void shareMethod(){  
    5.      }  
    6.      //每个产品相同方法,不同实现  
    7.      public abstract void doSomething();  
    8. }  

     

     

    产品A1的实现类
     
    1. public class ProductA1 extends AbstractProductA {  
    2.      public void doSomething() {  
    3.              System.out.println("产品A1的实现方法");  
    4.      }  
    5. }  

     

     
    1. 产品A2的实现类  
    2. public class ProductA2 extends AbstractProductA {  
    3.      public void doSomething() {  
    4.              System.out.println("产品A2的实现方法");  
    5.      }  
    6. }  
    产品B与此类似,不再赘述。


     

     
    1. 抽象工厂类  
    2. public abstract class AbstractCreator {  
    3.      //创建A产品家族  
    4.      public abstract AbstractProductA createProductA();   
    5.      //创建B产品家族  
    6.      public abstract AbstractProductB createProductB();  
    7. }  

    注意:有N个产品族,在抽象工厂类中就应该有N个创建方法。
     
    1. 产品等级1的实现类  
    2. public class Creator1 extends AbstractCreator {      
    3.      //只生产产品等级为1的A产品  
    4.      public AbstractProductA createProductA() {   
    5.              return new ProductA1();  
    6.      }  
    7.      //只生产产品等级为1的B产品  
    8.      public AbstractProductB createProductB() {  
    9.              return new ProductB1();  
    10.      }  
    11. }  

     
    1. 产品等级2的实现类  
    2. public class Creator2 extends AbstractCreator {      
    3.      //只生产产品等级为2的A产品  
    4.      public AbstractProductA createProductA() {   
    5.              return new ProductA2();  
    6.      }  
    7.      //只生产产品等级为2的B产品  
    8.      public AbstractProductB createProductB() {  
    9.              return new ProductB2();  
    10.      }  
    11. }  
    注意:M个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。

     

    场景类如下:

     

     
    1. public class Client {  
    2.      public static void main(String[] args) {  
    3.              //定义出两个工厂  
    4.              Abstract Creator creator1 = new Creator1();  
    5.              Abstract Creator creator2 = new Creator2();  
    6.              //产生A1对象  
    7.              AbstractProductA a1 =  creator1.createProductA();  
    8.              //产生A2对象  
    9.              AbstractProductA a2 = creator2.createProductA();  
    10.              //产生B1对象  
    11.              AbstractProductB b1 = creator1.createProductB();  
    12.              //产生B2对象  
    13.              AbstractProductB b2 = creator2.createProductB();  
    14.      }  
    15. }  
    16. 抽象工厂模式的优点:

      ● 封装性。

               每个产品的实现类不是高层模块要关心的,它要关心的是什么?是接口,是抽象,它不关心对象是如何创建出

      来,这由谁负责呢?工厂类,只要知道工厂类是谁,我就能创建出一个需要的对象,省时省力,优秀设计就应该如

      此。

       

      ● 产品族内的约束为非公开状态。

      缺点:
             抽象工厂模式的最大缺点就是产品族扩展非常困难,为什么这么说呢?我们以通用代码为例,如果要增加一个产

      品C,也就是说产品家族由原来的2个增加到3个,看看我们的程序有多大改动吧!抽象类AbstractCreator要增加一个

      方法createProductC(),然后两个实现类都要修改,想想看,这严重违反了开闭原则,而且我们一直说明抽象类和接

      口是一个契约。改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”,——只要与这

      段代码有关系,就可能产生侵害的危险!

    17. 两种设计模式的区别:

              区别在于产品,如果产品单一,最合适用工厂模式,但是如果有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。再通俗深化理解下:工厂模式针对的是一个产品等级结构 ,抽象工厂模式针对的是面向多个产品等级结构的。

      工厂方法模式与抽象工厂模式对比:

      工厂方法模式

      抽象工厂模式

      针对的是一个产品等级结构 针对的是面向多个产品等级结构
      一个抽象产品类 多个抽象产品类
      可以派生出多个具体产品类 每个抽象产品类可以派生出多个具体产品类
      一个抽象工厂类,可以派生出多个具体工厂类 一个抽象工厂类,可以派生出多个具体工厂类
      每个具体工厂类只能创建一个具体产品类的实例
 
不积跬步,无以至千里,不积小流,无以成江河
posted on 2018-02-23 09:26  陌上韶光  阅读(115)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3