设计模式之C#实现(一)--AbstractFactory

原创 2003年09月10日 11:41:00

Abstract Factory 读书笔记

意图:

       为创建相关的或者相互依赖的对象配置一个借口而不指定他们具体的类。

别名:

       Kit

理解:

       抽象工厂是一种创建型的模式,它为我们创建对象提供了有效地方法,我们不用直接new对象而是可以为创建对象配置一个接口,该接口定义了如何创建对象的方法。我们还知道抽象工厂创建的对象是一个系列的或者是一族的。该模式的最大特点就是将它的具体创建的任务交给了他的子类也就是具体的类,因此我们将创建对象的时间延迟到了它的子类。我们知道,在设计模式(GOF)的书里说了设计模式是为有一定面向对象基础的开发人员准备的。所以我们都应改知道类和类型之间的区别,在现在的编程语言里接口是最为抽象的数据结构,因此我们将我们的抽象工厂里的AbstractFactoy定义成接口也是很自然的。一个这样的工厂可以创建一族产品是什么意思呢?也就是说这一类产品都有相同的父类或者父接口。在这里我不想重复GOF里面的话关于这些对象之间的协作和结果以及带来的影响等等,这些在《Design Patterns Elements of Resable Object-Oriented Software》本书里可以看到。下面我想用C#实现这个模式来供大家参考。

结构:

<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

通过我们的面向对象的知识我们知道一个父类可以标识一个子类的对象,这也是理解这里的关键,我们在程序里将会用一个抽象类的对象表示一个子类的对象。如上图所示,我们现在有我们有一个IabstractFactoy的接口,该接口的职责就是实现创建对象的工作,我们再有两个具体的工厂ConcreteFactory1ConcreteFactory2他们就是具体实现接口中的函数他们实现了这两个方法,当然在具体的应用中可能没有两个具体的工厂,在GOF的书中说过在很多情况下我们并没有工厂的抽象接口,大多数情况都是直接使用具体工厂来实现的,在这里我想力图完整的描述书中的结构所以实现也是一样的。好了下面就是我的代码,这段代码显示了我们是怎么在C#中实现AbstractFactory的。我用一个WinForm来测试结构。

实现代码:

using System;

 

namespace AbstractFactory_Me

{

       public interface IAbstractFactory{

              IAbstractProductA CreateProductA();

              IAbstractProductB CreateProductB();

       }

 

       public interface IAbstractProductA{

              string ShowSelf();

              string ShowOther(IAbstractProductB b);

       }

       public class ProductA1 : IAbstractProductA{

              public ProductA1(){}

              public string ShowSelf(){

                     return this.ToString();

              }

              public string ShowOther(IAbstractProductB b){

                     return b.ToString();

              }

       }

       public class ProductA2 : IAbstractProductA{

              public ProductA2(){}

              public string ShowSelf(){

                     return this.ToString();

              }

              public string ShowOther(IAbstractProductB b){

                     return b.ToString();

              }

       }

 

       public interface IAbstractProductB{

              string ShowSelf();

              string ShowOther(IAbstractProductA a);

       }

       public class ProductB1 : IAbstractProductB{

              public string ShowSelf(){

                     return this.ToString();

              }

              public string ShowOther(IAbstractProductA a){

                     return a.ToString();

              }

       }

       public class ProductB2 : IAbstractProductB{

              public string ShowSelf(){

                     return this.ToString();

              }

              public string ShowOther(IAbstractProductA a){

                     return a.ToString();

              }

       }

 

       public class ConcreteFactory1 : IAbstractFactory{

 

              public IAbstractProductA CreateProductA(){

                     return new ProductA1();

              }

 

              public IAbstractProductB CreateProductB(){

                     return new ProductB1();

              }

 

       }

 

       public class ConcreteFactory2 : IAbstractFactory{

              public IAbstractProductA CreateProductA(){

                     return new ProductA2();

              }

              public IAbstractProductB CreateProductB(){

                     return new ProductB2();

              }

       }

       public class Client{

              public void run(){

                     IAbstractFactory factory1 = new ConcreteFactory1();

                     IAbstractProductA a = factory1.CreateProductA();

                     a.ShowSelf();

                     IAbstractProductB b = factory1.CreateProductB();

                     b.ShowSelf();

                     b.ShowOther(a);

              }

       }

}

我们在测试的WinForm里面放了一个richTextBox1实例,他用来显示结构。

private void Form1_Load(object sender, System.EventArgs e) {

                     this.richTextBox1.Clear();

                     IAbstractFactory factory1 = new ConcreteFactory1();

                     IAbstractProductA a = factory1.CreateProductA();

                     IAbstractProductB b = factory1.CreateProductB();

 

                     this.richTextBox1.AppendText(a.ShowSelf()+"/n");

                     this.richTextBox1.AppendText(b.ShowSelf()+"/n");

                     this.richTextBox1.AppendText(b.ShowOther(a)+"/n");

                     this.richTextBox1.AppendText(a.ShowOther(b)+"/n/n/n");

 

                     this.richTextBox1.AppendText(a.GetType().ToString()+"/n");

                     this.richTextBox1.AppendText(b.GetType().ToString()+"/n");

 

              }

为了清楚的说明问题我们在生成的对象中使用了ShowSelfShowOther的方法用来显示自己和另外一个对象。

如要查看书中该例子的C#实现请到这里:

http://www.csdn.net/Develop/read_article.asp?id=20949

希望本文可以对即将要学习设计模式或者还有疑惑的人提供帮助,由于作者的能力有限如果文中又不对的地方请指出,或者联系我(wu_jian830@hotmail.com)谢谢!

深入浅出设计模式 ------ Abstract Factory(抽象工厂)

本文可以和笔者的深入浅出设计模式 ------ Factory Method(工厂方法)参照着看, 可以区分这三个工厂模式的不同。...
  • wenniuwuren
  • wenniuwuren
  • 2015年01月29日 02:25
  • 1678

AbstractFactory抽象工厂模式

#include using namespace std;class ProductAbase { public: ProductAbase(){} virtual ~Product...
  • liuhuiyan_2014
  • liuhuiyan_2014
  • 2015年06月24日 21:38
  • 950

AbstractFactory——抽象工厂

一、定义        GOF里对抽象工厂模式这样定义:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。         有时候,我们希望在为客户代码提供实例化类的同时,能够控...
  • tonghu2010
  • tonghu2010
  • 2014年01月10日 15:44
  • 640

设计模式之AbstractFactory

1、意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的实例 2、适用性 在以下情况下可以使用Abstract Factory模式 (1)一个系统要独立于它的产品的创建、组合和表示时...
  • wuli2496
  • wuli2496
  • 2014年12月14日 14:57
  • 320

抽象工厂(AbstractFactory)

//#include "Product.h" class AbstractProductA; class AbstractProductB; class AbstractFactory { ...
  • du_bingbing
  • du_bingbing
  • 2015年08月28日 14:51
  • 145

抽象工厂模式 AbstractFactory

#include "stdafx.h" #include #include #include #include using namespace boost; enum Level1_Mon...
  • a1317338022
  • a1317338022
  • 2016年11月17日 22:18
  • 230

AbstractFactory抽象工厂模式

一、C实现栈 #include #include #include #define STACK_INIT_SIZE 10 #define STACKINCREMENT 2 typedef ...
  • tianmo2010
  • tianmo2010
  • 2013年08月26日 15:55
  • 894

AbstractFactory抽象工厂模式

设计模式C++学习笔记之七(AbstractFactory抽象工厂模式) 抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。对于工厂方法来说,抽象工厂可实现一系列产品...
  • Mrknowledge
  • Mrknowledge
  • 2013年08月01日 16:09
  • 444

自己动手实现一个C#中List

文章在我的游戏蛮牛博客中:http://www.unitymanual.com/blog-23965-2466.html?_dsign=b0a4d01a C#中的IList用着挺舒服的,非常容易上手...
  • sundong_d
  • sundong_d
  • 2015年04月11日 10:47
  • 1345

C#隐式实现接口成员与显示实现接口成员

对C#隐式实现接口成员与显示实现接口成员的简单说明
  • sirenxiaohuayuan
  • sirenxiaohuayuan
  • 2015年12月29日 14:50
  • 828
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式之C#实现(一)--AbstractFactory
举报原因:
原因补充:

(最多只允许输入30个字)