|
首页 另类生活 .NET技术 数据库技术 JavaScript技术 网页设计相关 技术专题 项目体系 网络日志 网站论坛 |
| 放心去飞 → 项目体系 → 软件方法学 → 设计模式 |
一、 抽象工厂(Abstract Factory)模式抽象工厂模式是所有形态的工厂模式中最为抽象和最具一般性的一种形态。 为了方便引进抽象工厂模式,引进一个新概念:产品族(Product Family)。所谓产品族,是指位于不同产品等级结构,功能相关联的产品组成的家族。如图: 图中一共有四个产品族,分布于三个不同的产品等级结构中。只要指明一个产品所处的产品族以及它所属的等级结构,就可以唯一的确定这个产品。 引进抽象工厂模式 所谓的抽象工厂是指一个工厂等级结构可以创建出分属于不同产品等级结构的一个产品族中的所有对象。如果用图来描述的话,如下图: 二、 Abstract Factory模式的结构:
具体工厂(Concrete Factory)角色:这个角色直接在客户端的调用下创建产品的实例。这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的。 抽象产品(Abstract Product)角色:担任这个角色的类是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。 具体产品(Concrete Product)角色:抽象工厂模式所创建的任何产品对象都是某一个具体产品类的实例。这是客户端最终需要的东西,其内部一定充满了应用系统的商业逻辑。 三、 程序举例:该程序演示了抽象工厂的结构,本身不具有任何实际价值。
//
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 ); } }
![]() ![]()
/**/
/// <summary> /// ClientApp test environment /// </summary>
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]
|
|
博客涉及 JavaScript 相关知识,包含 class 和 methods 等内容,可能围绕类和方法的使用、功能等方面展开,属于信息技术领域前端开发范畴。







}
}



模式&spm=1001.2101.3001.5002&articleId=502967&d=1&t=3&u=1da83eef11a44b42a4dddfbe0f61c143)
1168

被折叠的 条评论
为什么被折叠?



