创建模式的目的就是为了解决使用和生产责任分离,当然能使用这种模式的前提就是用户并不关心"产品"的创建逻辑和过程,用户只需要对创建的结果进行使用.在这种情况下,将使用和创建分离就增加了程序的灵活性,因为"产品"的构建对用户来说是透明的,如果需要对创建过程增加功能(比如增加创建权限检查),不会影响到用户的使用.
模式的应用有两个基本的目的,一是复用,二是适应变化.而且这两个目的在很大程度上也是统一 的.工厂类模式将使用和创建责任分离,其实就是为了适应"创建"的变化.当然这种"适应变化"的代价就是需要增加工厂类,增加了系统的复杂度和开销.因此选择模式的一个重要的工作就是要权衡利弊,其实在创建模式中就有一个隐形假设:工厂角色的变化相对固定,工厂类本身的创建非常简单.这个假设很重要,因为如果工厂本身的创建和可变性都很大的话,采用这种模式就得不偿失了.
简单工厂模式的原理其实很简单,就是将"产品"的创建工作委托给工厂类的静态方法来完成,有抽象产品的情况下,用户只需要用一个参数调用来获得"产品",而不需要知道具体的产品的细节,比如,抽象产品为水果,用户如果需要获取产品"苹果",则只要将"苹果"作为参数来调用水果工厂的创建水果的方法,而不需要知道苹果类本身的细节.这是简单工厂模式的好处.跟工厂方法相比,简单工厂模式逻辑简单,额外开销小(增加产品,不需要增加工厂类,因为是静态方法,工厂类本身也不需要创建等).
工厂方法模式的原理也是将"产品"的创建委托给工厂类进行,但由于工厂类的创建方法不是静态的,因此可以利用继承的好处,将具体的创建工作"延时"到子类进行.这种方式在设计和思考上是有非常大的好处的:将设计分层,每一层都只需要关心同一层面上的事情.工厂方法的做法是每个具体产品都用一个具体的工厂来进行创建.这样做的好处是符合面向对象编程的开放封闭原则,增加新的产品,只需要增加新的工厂类即可(对扩展开放),对任何产品的增加或修改,不会影响其它工厂类和产品类(对修改封闭),但缺点也是非常明显的,就是产品多的时候,系统中的类会很多.(成倍增加).跟简单工厂模式相比,一是系统不简洁,二是增加了工厂类的创建,三是用户的选择产品逻辑变成了对工厂类的选择,降低了选择的直观性.
抽象工厂方法可以看作是工厂方法的更一般的表达,抽象工厂针对的是产品族的概念(如果只有一种产品,就是工厂模式),如果按照抽象工厂的严格意义上来讲,应用场景会比较少(多种数据库支持,多种语言版本的情况可以用).能使用抽象工厂的应用场景一般可以表达为矩阵模型,同一行的是不同环境中的同一个产品的实现,同一列的产品都处于同一个应用环境下,系统每次只会用到一种环境的产品.典型的应用是Windows和Linux下的界面控件.如果只一族产品,则抽象工厂就可以退化成简单工厂来实现.
在实际使用中,简单工厂模式和工厂方法模式用得比较多,而抽象工厂方法用得比较少.当然,抽象工厂在类似于数据库连接方面应用还是比较好的,比如系统如果需要支撑多种数据库系统,就可以采用抽象工厂来进行构建.
===============================
其实类的创建现在有了一些新的变化,例如,将创建依赖放在配置文件,采用反射技术来构造实例,这种方法的好处是一时可以减少工厂类,极端的情况下一个工厂方法就可以了,同时工厂类与产品类也脱耦。现在有很多框架都采用这种方式(如Nhibernate等),就是所谓的依赖注入,如下所示:
public interface IPersonDao
{
int SaveData();
}
public class PersonDao : IPersonDao
{
#region IPersonDao 成员
public int SaveData()
{
return 100;
}
public PersonDao()
{
}
#endregion
}
public class ObjectFactory
{
private static Dictionary<string, string> _objects = null;
static ObjectFactory()
{
string theFile = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + "MyObjects.xml";
XElement root = XElement.Load(theFile);
var objs = from obj in root.Elements("object")
select obj;
_objects = objs.ToDictionary(k => k.Attribute("id").Value, v => v.Attribute("value").Value);
}
public static TRetObj GetObject<TRetObj>(string objectcode)
{
string theClassType = _objects[objectcode];
Type theType = Type.GetType(theClassType, false, true);
return (TRetObj)Activator.CreateInstance(theType);
}
}
MyObjects.xml
<?xml version="1.0" encoding="utf-8" ?>
<objects>
<object id="PersonDao" value="SpringNetStudy.PersonDao,SpringNetStudy"/>
</objects>
分享到:
相关推荐
4.简单工厂-工厂方法-抽象工厂 对比总结
介绍的是工厂模式 包括简单工厂模式、工厂方法模式、抽象工厂模式 包括PPT和代码
本文章通俗易懂的对工厂模式进行了讲解,相信您看完这篇文章会对工厂模式有更深入的了解
工厂方法模式和抽象工厂模式的区别,对工厂方法模式和抽象工厂模式做了简单的比较
设计模式之工厂方法、简单工厂、抽象工厂
NULL 博文链接:https://1193355343.iteye.com/blog/2370838
设计模式中工厂相关模式有简单工厂、工厂方法、抽象工厂学习后的练习代码,C++编程语言。
从简单工厂,到工厂方法到抽象工厂,这几种都带有“工厂”的模式,总是容易叫人迷糊,我仔细研究了下,然后用简单的例子做类比,列出了自己的通俗理解和比较,大部分是自己的体会,感觉理的比较清楚,末尾提了下...
这是代码,介绍请查看以下博客地址: http://www.cnblogs.com/homg/p/3548110.html代码乱码请使用utf-8编码。
主要讲述了c#中的简单工厂和虚方法、抽象类、抽象方法的语法和用法
通过抽象类中的抽象方法实现简单工厂模式。
c#工厂模式 简单工厂,抽象工厂,单件模式
1、抽象工厂模式+反射技术 2、抽象工厂模式+简单工厂模式 3、仅仅是抽象工厂模式
本资源主要介绍工厂方法模式和抽象工厂模式。二者都与工厂相关,,但是其本质又大相径庭。这里先来简单介绍下二者的区别,以免混淆。 抽象工厂模式:提供一个接口,用于创建一系列相关的对象,而无需指定具体的类。...
NULL 博文链接:https://jacky-dai.iteye.com/blog/2296369
主要介绍了Java设计模式之工厂模式,结合实例形式分析了简单工厂、工厂方法、抽象工厂等相关功能、实现与使用方法,需要的朋友可以参考下
常常被这三种设计模式弄的晕头转向的 毫不容易弄的差不多清楚了
NULL 博文链接:https://mrpengpengda.iteye.com/blog/1536290
C++ 工厂模式 (简单工厂、工厂和抽象工厂)
工厂模式在一些设计模式的书中分为简单工厂模式,工厂方法模式和抽象工厂模式三类。也有把工厂方法模式划分到抽象工厂模式的,认为工厂方法是抽象工厂模式的特例的一种,就是只有一个要实现的产品接口。