一、工厂方法(Factory Method)模式

前端之家收集整理的这篇文章主要介绍了一、工厂方法(Factory Method)模式前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

<div style="FONT-SIZE: 10pt">

一、 工厂方法(Factory Method)模式

方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。

方法模式中,核心的工厂类不再负责所有产品的创建,而是将具体创建工作交给子类去做。这个核心类仅仅负责给出具体工厂必须实现的接口,而不接触哪一个产品类被实例化这种细节。这使得工厂方法模式可以允许系统在不修改工厂角色的情况下引进新产品。

二、 Factory Method模式角色与结构:

方法模式的核心,与应用程序无关。任何在模式中创建的对象的工厂类必须实现这个接口。

调用以创建产品对象。在上图中有两个这样的角色:BulbCreator与TubeCreator。

方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在上图中,这个角色是Light。

三、 程序举例:

Highlighter1_45_116_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_45_116_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_150_327_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_150_327_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_188_236_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_188_236_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_276_325_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_276_325_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_361_538_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_361_538_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_399_447_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_399_447_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_487_536_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_487_536_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_573_611_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_573_611_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_649_717_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_649_717_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_689_715_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_689_715_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_755_823_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_755_823_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_795_821_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_795_821_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   Highlighter1_846_1153_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_846_1153_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_880_1151_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_880_1151_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">   

方法的活动序列图

包括:

调用BulbCreator的factory方法,之后BulbCreator调用BulbLight的构造函数创造出产品BulbLight对象。

四、 工厂方法模式与简单工厂模式

方法模式与简单工厂模式再结构上的不同不是很明显。工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。

方法模式之所以有一个别名叫多态性工厂模式是因为具体工厂类都有共同的接口,或者有共同的抽象父类

添加新的产品对象时,仅仅需要添加一个具体对象以及一个具体工厂对象,原有工厂对象不需要进行任何修改,也不需要修改客户端,很好的符合了"开放-封闭"原则。而简单工厂模式在添加新产品对象后不得不修改工厂方法,扩展性不好。

方法模式退化后可以演变成简单工厂模式。

五、 Factory Method模式演化

方法抽象工厂角色可以规定出多于一个的工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以提供不同的商业逻辑,以满足提供不同的产品对象的任务。

方法总是调用产品类的构造函数以创建一个新的产品实例,然后将这个实例提供给客户端。而在实际情形中,工厂方法所做的事情可以相当复杂。

查询。如果有满足要求的产品对象,就直接将产品返回客户端;如果聚集中没有这样的产品对象,那么就创建一个新的满足要求的产品对象,然后将这个对象登记到聚集中,再返还给客户端。"享元模式(Flyweight Pattern)"就是这样一个模式。

方法模式的实现依赖于工厂角色和产品角色的多态性。在有些情况下,这个模式可以出现退化。

方法返回的类型应当是抽象类型,而不是具体类型。调用工厂方法的客户端应当依赖抽象产品编程,而不是具体产品。如果工厂仅仅返回一个具体产品对象,便违背了工厂方法的用意,发生退化,这时就不再是工厂模式了。

六、 Factory Method模式与其它模式的关系

方法模式有关的模式还包括:模板方法模式、MVC模式、享元模式、备忘录模式

七、 另外一个例子

Highlighter1_125_127_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_125_127_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_175_177_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_175_177_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_228_230_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_228_230_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_282_284_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_282_284_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_338_340_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_338_340_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_389_391_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_389_391_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_443_445_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_443_445_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_494_496_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_494_496_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_550_552_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_550_552_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_592_861_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_592_861_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_695_723_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_695_723_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">  Highlighter1_770_799_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_770_799_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">  Highlighter1_779_795_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_779_795_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">    getHighlighter1_909_1104_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_909_1104_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_986_1102_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_986_1102_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">  Highlighter1_1152_1428_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_1152_1428_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_1229_1426_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_1229_1426_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">  Highlighter1_1431_1486_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_1431_1486_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">/**//// Highlighter1_1510_1936_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/405b18b4b6584ae338e0f6ecaf736533.gif" align="top">Highlighter1_1510_1936_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/1c53668bcee393edac0d7b3b3daff1ae.gif" align="top">Highlighter1_1557_1934_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_1557_1934_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">  Highlighter1_1780_1930_Open_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/2887d91d0594ef8793c1db92b8a1d545.gif" align="top">Highlighter1_1780_1930_Closed_Image" onclick="code_collapse_toggle(this);" src="/res/2019/03-05/01/7a2b9a960ee9a98bfd25d306d55009f8.gif" align="top">    


Box,Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社

-->
文章!使我对工厂方法有了新的认识,特别是最后的例子。感谢楼主! BTW:哈哈!我老婆带着我女儿去岳母家小住时,我也睡得很晚,看来大家都是这样吧。:P       
 re: C#设计模式(5)-Factory Method Pattern 2005-03-11 11:17
     
 re: C#设计模式(5)-Factory Method Pattern 2005-03-14 09:43
     
 re: C#设计模式(5)-Factory Method Pattern 2005-03-15 14:18
     
 re: C#设计模式(5)-Factory Method Pattern 2005-04-14 23:49
       
 re: C#设计模式(5)-Factory Method Pattern 2005-04-21 13:39
文章中提到“使用多个工厂方法:抽象工厂角色可以规定出多于一个的工厂方法,从而使具体工厂角色实现这些不同的工厂方法,这些方法可以提供不同的商业逻辑,以满足提供不同的产品对象的任务。”我对“商业逻辑”不知道理解的对不对:抽象工厂角色中的每一个工厂方法都是返回一种产品的抽象对象,正是这种抽象对象代表了一种商业逻辑。 我对商业逻辑的概念理解模糊,觉得您的最后一个例子体现了商业逻辑:class Resume : Document { // Factory Method implementation override public void CreatePages() { pages.Add( new SkillsPage() ); pages.Add( new EducationPage() ); pages.Add( new ExperiencePage() ); } } 我的理解是通过多种的产品组合,体现一些特定业务,不知道这样理解对不对? 这应该是两种不同的体现业务逻辑的方式吧?        
 re: C#设计模式(5)-Factory Method Pattern 2005-06-20 11:27
     
 re: C#设计模式(5)-Factory Method Pattern 2005-06-20 19:08
代码过于简单,以至于产生上面的误解。其实“依赖注入(或控制反转)Ioc”模式以及我在《设计模式随笔-让众口不再难调 》中提到的“条件外置”解决的就是你说的问题。 在一个比较大的系统中,往往是多组并行开发。所以软件设计可以分步并行开发。上面代码开发过程中可以如此安排。1)由系统架构师设计好抽象产品和抽象工厂。2.1)多组并行开发具体产品和具体工厂。2.2)与此同时另外一组使用依赖注入技术开发主程序。在1的工作完成后2.1与2.2是可以并行的。按上面方案很可能产生3个Assembly。最后通过配置文件完成组装。 因此在实际应用时,主程序的那段代码是利用配置文件“注入”得到的,或者主程序是单独开发,因此可以确保不知道具体工厂是谁。Wayfarer的一篇文章曾循序渐进的讨论过系统如何演进,如何引入配置文件等,只是记不起名字了,你可以到他的Blog上看看。       
 re: C#设计模式(5)-Factory Method Pattern 2005-07-06 09:18
     
 re: C#设计模式(5)-Factory Method Pattern 2005-07-15 15:03
     
 re: C#设计模式(5)-Factory Method Pattern 2005-12-23 11:13
     
 re: C#设计模式(5)-Factory Method Pattern 2006-01-16 17:04
     
 你好,想请教一下 2006-01-20 13:25
代码是怎么粘上去的,看起来很舒服       
 re: C#设计模式(5)-Factory Method Pattern 2006-03-08 21:51
     
 re: C#设计模式(5)-Factory Method Pattern 2006-05-01 11:28
     
 re: C#设计模式(5)-Factory Method Pattern 2006-06-13 23:30
     
 re: C#设计模式(5)-Factory Method Pattern 2007-02-05 10:56
     
 C#设计模式(5)[TrackBack] 2007-02-09 14:52
       
 re: C#设计模式(5)-Factory Method Pattern 2007-02-13 10:56
     
 C#设计模式--笔记[TrackBack] 2007-03-06 16:34
       
 re: C#设计模式(5)-Factory Method Pattern 2007-04-07 13:33
     
 re: C#设计模式(5)-Factory Method Pattern 2007-04-28 00:44
     
 re: C#设计模式(5)-Factory Method Pattern[未登录] 2007-05-06 19:09
方法里: Document[] docs = new Document[ 2 ];而Document是抽象类。在VB里面抽象类是不能被实例化的。翻译成vb应该是dim docs as new Document(2)        
 re: C#设计模式(5)-Factory Method Pattern[未登录] 2007-05-06 19:10
     
 re: C#设计模式(5)-Factory Method Pattern 2007-06-13 13:37

猜你在找的C#相关文章