Net设计模式实例之抽象工厂模式(Abstract Factory Pattern)
一、抽象工厂模式简介(Bref Introduction)
抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类。优点是:易于交换产品系列,由于具体工厂类在一个应该用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂类变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。抽象工厂的另一个优点是,它让具体的创建实例与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户的代码中。
二、解决的问题(What To Solve)
常用用于解决数据访问程序,也就是说程序通过使用抽象工厂模式后,可以灵活地在不同的数据库之间切换,而不需要费时费力地改变原有程序。
三、抽象工厂模式分析(Analysis)
1、抽象工厂模式结构
IProductA、IProductA接口:两个产品接口,他们都有可能有两种不同的实现。
ProductA1、ProductA2,ProductB1、ProductB2具体实现类:对两个产品接口的具体分类的实现。
AbstractFactory抽象类:抽象工厂接口,它里面应该包含所有产品创建的抽象方法。
ConcreteFactory1、ConcreteFactory2具体工厂类:创建具有特定实现的产品对象
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)的更多相关文章
- 【设计模式】抽象工厂模式 Abstract Factory Pattern
简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...
- 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)
原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factor ...
- 设计模式 - 抽象工厂模式(abstract factory pattern) 具体解释
抽象工厂模式(abstract factory pattern) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy/article/details/2709 ...
- 二十四种设计模式:抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式(Abstract Factory Pattern) 介绍提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 示例有Message和MessageModel,Messag ...
- 【UE4 设计模式】抽象工厂模式 Abstract Factory Pattern
概述 描述 提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类:具体的工厂负责实现具体的产品实例 抽象工厂中每个工厂可以创建多种产品(如苹果公司生产iPhone.iPad): 工厂方法 ...
- 设计模式学习心得<抽象工厂模式 Abstract Factory>
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在抽 ...
- IOS设计模式浅析之抽象工厂模式(Abstract Factory)
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- 设计模式之抽象工厂模式(Abstract Factory Pattern)
一.抽象工厂模式的由来 抽象工厂模式,最开始是为了解决操作系统按钮和窗体风格,而产生的一种设计模式.例如:在windows系统中,我们要用windows设定的按钮和窗体,当我们切换Linux系统时,要 ...
- C#设计模式——抽象工厂模式(Abstract Factory Pattern)
一.概述在软件开发中,常常会需要创建一系列相互依赖的对象,同时,由于需求的变化,往往存在较多系列对象的创建工作.如果采用常规的创建方法(new),会造成客户程序和对象创建工作的紧耦合.对此,抽象工厂模 ...
随机推荐
- Opencv算法学习二
1.直方图:图片中像素值分布情况的坐标图. 直方图均衡化:按一定规律拉伸像素值,提高像素值少的点,增加原图的对比度,使人感觉更清晰的函数. equalizeHist( src, dst ); 2.ha ...
- 【四】搭建Markdown的编辑器
本系列有五篇:分别是 [一]Ubuntu14.04+Jekyll+Github Pages搭建静态博客:主要是安装方面 [二]jekyll 的使用 :主要是jekyll的配置 [三]Markdown+ ...
- Unity学习疑问记录之坐标体系
[Unity3D的四种坐标系] 1.World Space(世界坐标):我们在场景中添加物体(如:Cube),他们都是以世界坐标显示在场景中的.transform.position可以获得该位置坐标. ...
- Cocos2d-x游戏引擎实战开发炸弹超人项目教程 全套下载 1至6课
下载地址: http://pan.baidu.com/s/1b19HN
- 细说ES7 JavaScript Decorators
开篇概述 在上篇的ES7之Decorators实现AOP示例中,我们预先体验了ES7的Decorators,虽然它只是一个简单的日志AOP拦截Demo.但它也足以让我们体会到ES7 Decorator ...
- 多线程中的锁系统(三)-WaitHandle、AutoResetEvent、ManualResetEvent
本章主要介绍下基于内核模式构造的线程同步方式,事件,信号量. 阅读目录: 理论 WaitHandle AutoResetEvent ManualResetEvent 总结 理论 Windows的线程同 ...
- 女生的最爱,装饰品。WPF也有,Adorner。(上海晒衣服理念)
说到装饰,不由要说到女性. 去年过年回家给我妈买了周大福项链,很明显就感觉待遇就不一样了,即使这样,还是被一个阿姨说应该买更重点的.看来钱这种东西果然是多一点才好.虽然自己无所谓,但让家里人更开心也是 ...
- Outlook HTML渲染引擎
OutLook始终不离不弃 是不是很讨厌为Email代码兼容Outlook? 太遗憾了!虽然光都有尽头,但Outlook始终存在. 为了应付Email的怪癖,我们花了很多时间测试,确保我们搞定了所有O ...
- 《Entity Framework 6 Recipes》中文翻译系列 (35) ------ 第六章 继承与建模高级应用之TPH继承映射中使用复合条件
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 6-11 TPH继承映射中使用复合条件 问题 你想使用TPH为一张表建模,建模中使 ...
- enum操作--获取枚举里的最大值
一个应用系统,如果程序里没有任何enum的使用,我认为它的可读性是有待商榷的. 求枚举里的最大/最小枚举值, 其实是对Array进行操作: enum EnumTest { ddd = , eee } ...