设计模式:抽象工厂方法模式

简介:

之前写的模式帖子:

 设计模式系列目录

今天说一下抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。

抽象工厂允许客户使用抽象的接口来创建一组相关的产品,而不需要知道实际产出的具体产品是什么,这样一来,客户就从具体的产品中被解耦

我之前说过设计模式:工厂方法模式,我们最后会做一下两种模式的区别

我们看用类图看一下这个模式

每个抽象产品都有多于一个的一个人的具体子类,工厂角色怎么知道实例化哪一个子类?比如我们这个图,每个抽象产品都有两个具体产品,

抽象工厂有两个具体的工厂,分别对应这两个具体产品角色,每一个具体工厂只负责某一个家族的产品的实例化

我们来看一下代码

复制代码
#region 抽象工厂模式
 
     #region 产品
     #region 产品A
     /// <summary>
     /// 抽象产品A
     /// </summary>
     public  abstract  class  ProductA
     {
 
     }
 
     public  class  ConcreteProductA1 : ProductA
     {
         public  ConcreteProductA1()
         {
             Console.WriteLine( "ProductA的ConcreteProductA1...A1" );
         }
     }
     public  class  ConcreteProductA2 : ProductA
     {
         public  ConcreteProductA2()
         {
             Console.WriteLine( "ProductA的ConcreteProductA2...A2" );
         }
     }
     #endregion
 
     #region 产品B
     /// <summary>
     /// 抽象产品B
     /// </summary>
     public  abstract  class  ProductB
     {
 
     }
 
     public  class  ConcreteProductB1 : ProductB
     {
         public  ConcreteProductB1()
         {
             Console.WriteLine( "ProductB的ConcreteProductB1类...B1" );
         }
     }
     public  class  ConcreteProductB2 : ProductB
     {
         public  ConcreteProductB2()
         {
             Console.WriteLine( "ProductB的ConcreteProductB2类...B2" );
         }
     }
 
     #endregion
 
     #endregion
 
 
     #region 工厂类
     public  abstract  class  Creator
     {
         public  abstract  ProductA CreateProductA();
         public  abstract  ProductB CreateProductB();
     }
 
     public  class  ConcreteCreatorA : Creator
     {
         public  override  ProductA CreateProductA()
         {
             return  new  ConcreteProductA1();
         }
 
         public  override  ProductB CreateProductB()
         {
             return  new  ConcreteProductB1();
         }
     }
 
     public  class  ConcreteCreatorB : Creator
     {
         public  override  ProductA CreateProductA()
         {
             return  new  ConcreteProductA2();
         }
 
         public  override  ProductB CreateProductB()
         {
             return  new  ConcreteProductB2();
         }
     }
 
     #endregion
     #endregion  
复制代码
复制代码
//Client
         static  void  Main( string [] args)
         {           
 
             #region 抽象工厂模式
             Creator _creatorA = new  ConcreteCreatorA();
             _creatorA.CreateProductA();
             _creatorA.CreateProductB();
 
             Creator _creatorB = new  ConcreteCreatorB();
             _creatorB.CreateProductA();
             _creatorB.CreateProductB();
             #endregion
 
             Console.ReadLine();
         }  
复制代码

 

抽象工厂模式除了具有工厂方法模式的做点外,主要就是可以在类的内部对产品族进行约束。所谓的产品族一般都有一定的联系,抽象工厂模式就可以

在类内部对产品族的关联关系进行描述,而不必专门引入一个新的类来进行管理。抽象模式最大的缺点就是产品族的扩展,如果要加一个新的产品,差不多所有

的工厂类都需要进行修改,所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。

这们来说一个抽象工厂模式和工厂模式的区别:

我们看一下抽象模式的类图:设计模式:工厂方法模式

工厂方法模式:
一个抽象产品类,可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类只能创建一个具体产品类的实例。
抽象工厂模式:
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 
一个抽象工厂类,可以派生出多个具体工厂类。 
每个具体工厂类可以创建多个具体产品类的实例。 
区别:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 
工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个

 

本文转自lpxxn博客园博客,原文链接:http://www.cnblogs.com/li-peng/archive/2013/02/19/2917394.html,如需转载请自行联系原作者


相关文章
|
17天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
1月前
|
设计模式
设计模式之抽象工厂
设计模式之抽象工厂
|
13天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
1天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
2天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
3天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
12 0
|
13天前
|
设计模式 Java
小谈设计模式(9)—工厂方法模式
小谈设计模式(9)—工厂方法模式
|
1月前
|
设计模式 关系型数据库 数据库
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
【C++ 设计模式 工厂模式对比】深入探索设计模式:工厂方法与抽象工厂的比较与对照
21 1
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
22 0