zoukankan      html  css  js  c++  java
  • 设计模式(3)之抽象工厂模式 阿正

      抽象工厂模式是工厂模式的泛化版本,工厂模式是一种特殊的抽象工厂模式。在工厂模式中,每一个工厂只能生产一种具体的产品,而在抽象工厂模式中,每一个工厂可以生产多个具体的产品
         
         名词解释:
         1.产品等级:铲平等级结构即产品的继承关系结构,比如 父类是抽象电视机类,有比如海尔电视机 海信电视机 等具体电视机子类。则抽象电视机于具体的电视机子类就构成了产品等级关系。
         2.产品族:在抽象工厂模式中,产品族是指同一个工厂生产的,位于不同产品等级结构中的一组产品。比如 海尔电器工厂生产海尔冰箱 海尔洗衣机 这些产品虽属于不同的产品等级接口,却都是海尔工厂生产的,因为称为一个产品族。
     
         案列分析:
         需求:一个电器工厂可以生产多种类型的电器,比如海尔工厂可以生产 海尔洗衣机 海尔并行  海信工厂可以生产海信电视机  海信冰箱,相同品牌的电器构成了一个产品族,而相同类型的产品构成了一个产品等级结构,现使用抽象工厂模式模拟该场景.
         伪代码:
         //抽象产品类television(电视),它可以是一个接口,也可以是一个抽象类,其中包含生产电视机的方法play的声明
         public interface Television
         {
              public void play();
         }
         //HaierTevision是Televison的子类,实现了父类Televison的play方法
         public class HaierTelevision extends Telvision
         {
              public void play()
              {
                   echo '我在生产海尔电视机';
              }
         }
         //Haisence是Telvision的子类,HaierTelevison Television 和haisenceTelevision 构成了一个产品等级
         public class HaisenceTelevison extens Telvision
         {
              public void play()
              {
                   echo '我在生产海信电视机';
              }
         }
         //抽象产品类icebox(冰箱),它可以是一个接口 也可是是一个抽象类,里面声明了生产冰箱的方法produse
         public interface icebox
         {
              public void produce();
         }
         //具体冰箱产品类HaierIcebox继承了父类icebox,实现了父类的produce方法
         public class HaierIcebox extends icebox
         {
              public void produce()
              {
                   echo '我在生产海尔冰箱';
              }
         }
         //具体产品类HaisenceIcebox继承了父类icebox,与 icebox HaierIcebox 构成一个产品等级
         public class HaisenceIcebox extends icebox
         {
              public void produce()
              {
                   echo '我在生产海信冰箱';
              }
         }
     
         public interface efactory
         {
              //生产电视机,返回电视抽象类对象
              public Television produceTelevision();
              public Icebox prodecuIcebox();
         }
         //海尔具体工厂类,继承父类efactory,实现父类中生产电视和冰箱的方法,海尔所生产的所有产品构成一个产品族
         public class HaierFacetory extends efactory
         {    
                   //生产海尔电视
                   public Telvision produceTelevision()
                   {
                        return new HaierTelevision();
                   }
                   //生产海尔冰箱
                   public icebox produceIcebox()
                   {
                        return new HaierIcebox();
                   }
         }
         //海信具体工厂类,继承父类efactory,实现父类中生产电视盒冰箱的方法,海信所生产的所有产品构成一个产品族
         public class HaisenceFactory extends efactory
         {
              public Telvision produceTelvision()
              {
                   return new HaisenceTelevision();
              }
              public icebox produceIcebox()
              {
                   return new HaisenceIcebox();
              }
         }
         
         efactory HaierFactory HaisenceFactory 构成了一个工厂等级结构
     
         客户端调用代码:
         $factory = new Config::get('use_factory');
         $tv = $factory->produceTelevision();//工厂创建对象
         $tv->play();//生产电视机
         $icebox = $factory->produceIcebox();//工厂创建对象
         $icebox->produceIcebox();//生产冰箱
     
        抽象工厂欧式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类穿件一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和新的产品族很方便;缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈倾斜性。
     
         抽象工厂模式使用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多余一个的产品族,而每次只只用一个产品族;同属于同一个产品族的产品将一起使用;系统中提供一个产品的类库,所有的产品以同样的接口出现,从而是客户端不依赖于具体实现。
  • 相关阅读:
    Maven项目 Struts和Spring整合
    Android Binder机制
    Android屏幕适配
    AIDL初识
    Android插件化初识
    OOM解决方案
    ANR
    Android性能优化
    Android内存泄露总结
    Glide源码解析
  • 原文地址:https://www.cnblogs.com/azheng007/p/2653719.html
Copyright © 2011-2022 走看看