专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
抽象工厂(Abstract Factory)模式
2019-04-15 14:22
发布
生成海报
站内文章
/
PIC单片机
10364
0
1186
加入收藏
联系我们
网站搜索
首页
另类生活
.NET技术
数据库技术
JavaScript技术
网页设计相关
技术专题
项目体系
网络日志
网站论坛
放心去飞
→
项目体系
→
软件方法学
→
设计模式
一、 抽象工厂(Abstract Factory)模式
抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。为了方便引进抽象工厂模式,引进一个新概念:
产品族(Product Family)
。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图:
图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。引进抽象工厂模式所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用图来描述的话,如下图:
二、 Abstract Factory模式的结构:
图中描述的东西用产品族描述如下:
抽象工厂(Abstract Factory)角 {MOD}:
担任这个角 {MOD}的是工厂方法模式的核心,它是与应用系统商业逻辑无关的。
具体工厂(Concrete Factory)角 {MOD}:
这个角 {MOD}直接在客户端的调用下创建产品的实例。这个角 {MOD}含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。
抽象产品(Abstract Product)角 {MOD}:
担任这个角 {MOD}的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
具体产品(Concrete Product)角 {MOD}:
抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。
三、 程序举例:
该程序演示了抽象工厂的结构,本身不具有任何实际价值。
//
Abstract Factory pattern -- Structural example
using
System;
//
"AbstractFactory"
abstract
class
AbstractFactory
{
//
Methods
abstract
public
AbstractProductA CreateProductA();
abstract
public
AbstractProductB CreateProductB();
}
//
"ConcreteFactory1"
class
ConcreteFactory1 : AbstractFactory
{
//
Methods
override
public
AbstractProductA CreateProductA()
{
return
new
ProductA1();
}
override
public
AbstractProductB CreateProductB()
{
return
new
ProductB1();
}
}
//
"ConcreteFactory2"
class
ConcreteFactory2 : AbstractFactory
{
//
Methods
override
public
AbstractProductA CreateProductA()
{
return
new
ProductA2();
}
override
public
AbstractProductB CreateProductB()
{
return
new
ProductB2();
}
}
//
"AbstractProductA"
abstract
class
AbstractProductA
{
}
//
"AbstractProductB"
abstract
class
AbstractProductB
{
//
Methods
abstract
public
void
Interact( AbstractProductA a );
}
//
"ProductA1"
class
ProductA1 : AbstractProductA
{
}
//
"ProductB1"
class
ProductB1 : AbstractProductB
{
//
Methods
override
public
void
Interact( AbstractProductA a )
{
Console.WriteLine(
this
+
"
interacts with
"
+
a );
}
}
//
"ProductA2"
class
ProductA2 : AbstractProductA
{
}
//
"ProductB2"
class
ProductB2 : AbstractProductB
{
//
Methods
override
public
void
Interact( AbstractProductA a )
{
Console.WriteLine(
this
+
"
interacts with
"
+
a );
}
}
//
"Client" - the interaction environment of the products
class
Environment
{
//
Fields
private
AbstractProductA AbstractProductA;
private
AbstractProductB AbstractProductB;
//
Constructors
public
Environment( AbstractFactory factory )
{
AbstractProductB
=
factory.CreateProductB();
AbstractProductA
=
factory.CreateProductA();
}
//
Methods
public
void
Run()
{
AbstractProductB.Interact( AbstractProductA );
}
}
/**/
///
///
ClientApp test environment
///
class
ClientApp
{
public
static
void
Main(
string
[] args)
{
AbstractFactory factory1
=
new
ConcreteFactory1();
Environment e1
=
new
Environment( factory1 );
e1.Run();
AbstractFactory factory2
=
new
ConcreteFactory2();
Environment e2
=
new
Environment( factory2 );
e2.Run();
}
}
[dvnews_page]
四、 在什么情形下使用抽象工厂模式:
在以下情况下应当考虑使用抽象工厂模式:
一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
这个系统有多于一个的产品族,而系统只消费其中某一产品族。
同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。
系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
五、 抽象工厂的起源
据说最早的应用是用来创建在不同操作系统的视窗环境下都能够运行的系统。比如在Windows与Unix系统下都有视窗环境的构件,在每一个操作系统中,都有一个视窗构件组成的构件家族。我们可以通过一个抽象角 {MOD}给出功能描述,而由具体子类给出不同操作系统下的具体实现,如图:
可以发现上面产品类图有两个产品等级结构,分别是Button与Text;同时有两个产品族:Unix产品族与Windows产品族。
系统对产品对象的创建要求由一个工厂的等级结构满足。其中有两个具体工厂角 {MOD},即UnixFactory和WinFactory。UnixFactory对象负责创建Unix产品族中的产品,而WinFactory负责创建Windows产品族中的产品。
显然一个系统只能够在某一个操作系统的视窗环境下运行,而不能同时在不同的操作系统上运行。所以,系统实际上只能消费属于同一个产品族的产品。在现代的应用中,抽象工厂模式的使用范围已经大大扩大了,不再要求系统只能消费某一个产品族了。
六、 Abstract Factory模式在实际系统中的实现
Herbivore:草食动物
Carnivore:食肉动物
Bison:['baisn],美洲或欧洲的野牛下面实际代码演示了一个电脑游戏中创建不同动物的抽象工厂。尽管在不同大陆下动物物种是不一样的,但动物间的关系仍然保留了下来。
//
Abstract Factory pattern -- Real World example
using
System;
//
"AbstractFactory"
abstract
class
ContinentFactory
{
//
Methods
abstract
public
Herbivore CreateHerbivore();
abstract
public
Carnivore CreateCarnivore();
}
//
"ConcreteFactory1"
class
AfricaFactory : ContinentFactory
{
//
Methods
override
public
Herbivore CreateHerbivore()
{
return
new
Wildebeest(); }
override
public
Carnivore CreateCarnivore()
{
return
new
Lion(); }
}
//
"ConcreteFactory2"
class
AmericaFactory : ContinentFactory
{
//
Methods
override
public
Herbivore CreateHerbivore()
{
return
new
Bison(); }
override
public
Carnivore CreateCarnivore()
{
return
new
Wolf(); }
}
//
"AbstractProductA"
abstract
class
Herbivore
{
}
//
"AbstractProductB"
abstract
class
Carnivore
{
//
Methods
abstract
public
void
Eat( Herbivore h );
}
//
"ProductA1"
class
Wildebeest : Herbivore
{
}
//
"ProductB1"
class
Lion : Carnivore
{
//
Methods
override
public
void
Eat( Herbivore h )
{
//
eat wildebeest
Console.WriteLine(
this
+
"
eats
"
+
h );
}
}
//
"ProductA2"
class
Bison : Herbivore
{
}
//
"ProductB2"
class
Wolf : Carnivore
{
//
Methods
override
public
void
Eat( Herbivore h )
{
//
Eat bison
Console.WriteLine(
this
+
"
eats
"
+
h );
}
}
//
"Client"
Ta的文章
更多
>>
关于C6000DSP的堆与栈的解释zt
0 个评论
抽象工厂(Abstract Factory)模式
0 个评论
【HDU - 5716 】带可选字符的多字符串匹配 【ShiftAnd 算法 模板】
0 个评论
AD620 AD623原理图PCB电路设计,使用经验和建议——【电路模块经验12】
0 个评论
热门文章
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮