设计模式(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();//生产冰箱
 
    抽象工厂欧式的主要优点是隔离了具体类的生成,使得客户并不需要知道什么被创建,而且每次可以通过具体工厂类穿件一个产品族中的多个对象,增加或者替换产品族比较方便,增加新的具体工厂和新的产品族很方便;缺点在于增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈倾斜性。
 
     抽象工厂模式使用情况包括:一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节;系统中有多余一个的产品族,而每次只只用一个产品族;同属于同一个产品族的产品将一起使用;系统中提供一个产品的类库,所有的产品以同样的接口出现,从而是客户端不依赖于具体实现。
posted @ 2012-08-24 09:57  阿正-WEB  阅读(350)  评论(0编辑  收藏  举报