一、抽象工厂模式简介(Bref Introduction)

抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。优点是:易于交换产品系列,由于具体工厂类在一个应该用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂类变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。抽象工厂的另一个优点是,它让具体的创建实例与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户的代码中。

二、解决的问题(What To Solve)

常用用于解决数据访问程序,也就是说程序通过使用抽象工厂模式后,可以灵活地在不同的数据库之间切换,而不需要费时费力地改变原有程序。

三、抽象工厂模式分析(Analysis)

1、抽象工厂模式结构

IProductAIProductA接口:两个产品接口,他们都有可能有两种不同的实现。

ProductA1ProductA2ProductB1ProductB2具体实现类:对两个产品接口的具体分类的实现。

AbstractFactory抽象类:抽象工厂接口,它里面应该包含所有产品创建的抽象方法。

ConcreteFactory1ConcreteFactory2具体工厂类:创建具有特定实现的产品对象

2、源代码

1、产品接口IProductA、IProductB及其两种实现

public interface IProductA

{

void Show();

}

public class ProductA1 : IProductA

{

public void Show()

{

Console.WriteLine("具体产品类{0}展示方法。",this.GetType().Name);

}

}

public class ProductA2 : IProductA

{

public void Show()

{

Console.WriteLine("具体产品类{0}展示方法。", this.GetType().Name);

}

}

public interface IProductB

{

void Insert();

}

public class ProductB1 : IProductB

{

public void Insert()

{

Console.WriteLine("具体产品类{0}插入方法。", this.GetType().Name);

}

}

public class ProductB2 : IProductB

{

public void Insert()

{

Console.WriteLine("具体产品类{0}插入方法。", this.GetType().Name);

}

}

2、抽象工厂接口AbstractFactory,及其具体的工厂AbstractFactory1、AbstractFactory2

public abstract class AbstractFactory

{

public abstract IProductA CreateProductA();

public abstract IProductB CreateProductB();

}

public class AbstractFactory1:AbstractFactory

{

public override IProductA CreateProductA()

{

IProductA productA1 = new ProductA1();

return productA1;

}

public override IProductB CreateProductB()

{

IProductB productB1 = new ProductB1();

return productB1;

}

}

public class AbstractFactory2 : AbstractFactory

{

public override IProductA CreateProductA()

{

IProductA productA2 = new ProductA2();

return productA2;

}

public override IProductB CreateProductB()

{

IProductB productB2 = new ProductB2();

return productB2;

}

}

3、客户端代码

static void Main(string[] args)

{

//根据需求调用具体工厂AbstractFactory1

AbstractFactory factory1 = new AbstractFactory1();

IProductA productA1 = factory1.CreateProductA();

IProductB productB1 = factory1.CreateProductB();

productA1.Show();

productB1.Insert();

Console.WriteLine("\n");

//根据需求调用具体工厂AbstractFactory2

AbstractFactory factory2 = new AbstractFactory2();

IProductA productA2 = factory2.CreateProductA();

IProductB productB2 = factory2.CreateProductB();

productA2.Show();

productB2.Insert();

Console.ReadKey();

}

3、程序运行结果

四.案例分析(Example)

1、场景

使用抽象工厂+反射+配置文件实现数据访问层程序。结构如下图所示

用反射+抽象工厂+配置文件的数据访问程序。

Assembly.Load("程序集名称").CreateInstance("命名空间.类名称")。比如:

IProduct product=(IProduct)Assembly.Load("抽象工程模式").CreateInstance("抽象工程模式.SqlServerProduct")。

常用做法是:

Private static readonly string AssemblyName="抽象工程模式";

Private static readonly string DB=ConfiurationManager.AppSettings["db"];

配置文件如下:

<configuration>

<appSettings>

<add key="db" value="Sqlserver"/>

<appSettings>

<configuration>

通过读配置文件给DB字符赋值,在配置文件中写明当前使用的是SqlServer 还是Access数据库。反射+抽象工厂+配置文件解决方案解决了数据访问时的可维护、可扩展问题

2、代码

1、对象Uer、Product及其相对应的操作

public interface IUser

{

void Insert();

}

public class SqlServerUser:IUser

{

public void Insert()

{

Console.WriteLine("{0}插入用户.",this.GetType().Name);

}

}

public class AccessUser : IUser

{

public void Insert()

{

Console.WriteLine("{0}插入用户.", this.GetType().Name);

}

}

public interface IProduct

{

void GetProduct();

}

public class SqlServerProduct : IProduct

{

public void GetProduct()

{

Console.WriteLine("{0}查询商品.", this.GetType().Name);

}

}

public class AccessProduct : IProduct

{

public void GetProduct()

{

Console.WriteLine("{0}查询商品.", this.GetType().Name);

}

}

2、数据访问类DataAccess

public class DataAccess

{

private static readonly string AssemblyName ="AbstractFactoryReflection";

private static readonly string db = "SqlServer";

public static IUser CreateUser()

{

string className = AssemblyName + "." + db + "User";

IUser user = (IUser)Assembly.Load(AssemblyName).CreateInstance(className);

return user;

}

public static IProduct CreateProduct()

{

string className = AssemblyName + "." + db + "Product";

return(IProduct)Assembly.Load(AssemblyName).CreateInstance(className);

}

}

3、客户端代码

static void Main(string[] args)

{

IUser user = DataAccess.CreateUser();

user.Insert();

IProduct product = DataAccess.CreateProduct();

product.GetProduct();

Console.ReadKey();

}

 

五、总结(Summary)

抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。抽象工厂模式的典型应用就是,使用抽象工厂+反射+配置文件实现数据访问层程序。

转载自:http://www.cnblogs.com/ywqu/archive/2010/01/08/1641825.html

Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)的更多相关文章

  1. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  2. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...

  3. 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释

    抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...

  4. 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)

    抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...

  5. 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern

    概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...

  6. 设计模式学习心得<抽象工厂模式 Abstract Factory>

    抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...

  7. IOS设计模式浅析之抽象工厂模式(Abstract Factory)

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  8. 设计模式之抽象工厂模式(Abstract Factory Pattern)

    一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...

  9. C#设计模式——抽象工厂模式(Abstract Factory Pattern)

    一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...

随机推荐

  1. Node.js 框架

    Node.js的是一个JavaScript平台,它允许你建立大型的Web应用程序.  Node.js的框架平台使用JavaScript作为它的脚本语言来构建可伸缩的应用. 当涉及到Web应用程序的开发 ...

  2. 【转】Artificial Neurons and Single-Layer Neural Networks

    原文:written by Sebastian Raschka on March 14, 2015 中文版译文:伯乐在线 - atmanic 翻译,toolate 校稿 This article of ...

  3. C#_闭包陷阱

    如果匿名方法(Lambda表达式)引用了某个局部变量,编译器就会自动将该引用提升到该闭包对象中. 即将for循环中的变量i修改成了引用闭包对象的公共变量i.这样一来,即使代码执行后离开了原局部变量i的 ...

  4. 基于 Jenkins 快速搭建持续集成环境

      什么是持续集成 随着软件开发复杂度的不断提高,团队开发成员间如何更好地协同工作以确保软件开发的质量已经慢慢成为开发过程中不可回避的问题.尤其是近些年来,敏捷(Agile) 在软件工程领域越来越红火 ...

  5. Python黑帽编程1.3 Python运行时与包管理工具

    Python黑帽编程1.3  Python运行时与包管理工具 0.1  本系列教程说明 本系列教程,采用的大纲母本为<Understanding Network Hacks Attack and ...

  6. 使用border做三角形

    网站上经常会使用一些三角形,除了图片的方式,实际上利用border我们可以做出纯CSS的三角形.我们知道border是个边抖可以单独设置,当四个边相交的时候他们是什么时候改变的? .t0{ margi ...

  7. 说说Java程序和数据库交互的乱码解决

    本文就本人遇到的问题进行讲解 1.通过jdbc直连方式,连接Mysql数据库,从程序向数据库中写入数据出现的乱码解决方案. 当通过程序向Student表中写入一条数据时,写入数据库的内容会产生乱码. ...

  8. Spark DAGSheduler生成Stage过程分析实验

    RDD.Action触发SparkContext.run,这里举最简单的例子rdd.count() /** * Return the number of elements in the RDD. */ ...

  9. WCF 安全性之 自定义用户名密码验证

    案例下载 http://download.csdn.net/detail/woxpp/4113172 客户端调用代码 通过代理类 代理生成 参见 http://www.cnblogs.com/woxp ...

  10. [erl] erlang 进程注册和注销

    想要注册一个进程,必须先要创建一个进程. 如何创建一个进程,可以使用spawn.spawn_link,它们虽然都能创建进程,但是也有微妙的区别: 1)当前进程中创建一个并行进程,当被生成的进程崩溃时, ...