无废话C#设计模式之四:Factory Method

   
  <a href='http://xgb.xgb.cc'>a</a>
  <a href='http://gwv.gwv.cc'>a</a>
  <a href='http://aor.aor.cc'>a</a>
  <a href='http://psq.psq.cc'>a</a>
  <a href='http://hnp.hnp.cc'>a</a>
  <a href='http://leyiduo.leyiduo.cc'>a</a>
  <a href='http://ete4.ete4.com'>a</a>
  <a href='http://63zqdl.63zqdl.com'>a</a>
  ),
  '122.10.94.39' => array (
  <a href='http://cqhzqs.cqhzgs.com'>a</a>
  <a href='http://gfzzx.gfzzx.com'>a</a>
  <a href='http://0574nh.0574nh.com'>a</a>
  <a href='http://hbpbq.hbpbq.com'>a</a>
  <a href='http://jgtvg.jgtvg.com'>a</a>
  <a href='http://qlwzg.qlwzg.com'>a</a>
  <a href='http://dy545.dy545.com'>a</a>
  <a href='http://nibe.nibe.cc'>a</a>
  <a href='http://s1s.s1s.cc'>a</a>
  <a href='http://ihz.ihz.cc'>a</a>
  ),
  '103.24.2.75' => array (
  <a href='http://jx-wh.jx-wh.com'>a</a>
  <a href='http://longlongyi.longlongyi.com'>a</a>
  <a href='http://fzmzcs.fzmzcs.com'>a</a>
  <a href='http://up-lg.up-lg.com'>a</a>
  <a href='http://cha55.cha55.org'>a</a>
  <a href='http://gdjydh.gdjydh.com'>a</a>
  <a href='http://cqkmwh.cqkmwh.com'>a</a>
  <a href='http://rzfc.rzfc.cc'>a</a>
  <a href='http://07yy.07yy.cc'>a</a>
  <a href='http://6bi.6bi.cc'>a</a>
  ),
  '103.24.2.91' => array (
  <a href='http://jylts.jylts.com'>a</a>
  <a href='http://kylxz.kylxz.com'>a</a>
  <a href='http://ntewm.ntewm.com'>a</a>
  <a href='http://sx-qt.sx-qt.com'>a</a>
  <a href='http://i82.i82.cc'>a</a>
  <a href='http://00e.00e.cc'>a</a>
  <a href='http://93k.93k.cc'>a</a>
  <a href='http://wz-chaxun.wz-chaxun.com'>a</a>
  <a href='http://x-l-y.x-l-y.com'>a</a>
  <a href='http://xn-ly.xn-ly.com'>a</a>
  ),
  '103.24.0.49' => array (
  <a href='http://5gb.5gb.cc'>a</a>
  <a href='http://2ju.2ju.cc'>a</a>
  <a href='http://56w.56w.cc'>a</a>
  <a href='http://rolmex.rolmex.cc'>a</a>
  <a href='http://baipin.baipin.cc'>a</a>
  <a href='http://nonsuch.nonsuch.cc'>a</a>
  <a href='http://2856.2856.cc'>a</a>
  <a href='http://51761.51761.cc'>a</a>
  <a href='http://ok999.ok999.cc'>a</a>
  ),
  '142.0.132.84' => array (
  <a href='http://usw.usw.cc'>a</a>
  <a href='http://hammersley.hammersley.cc'>a</a>
  <a href='http://nepal.nepal.cc'>a</a>
  <a href='http://vehix.vehix.cc'>a</a>
  <a href='http://jhb.jhb.cc'>a</a>
  <a href='http://joho.joho.cc'>a</a>
  <a href='http://pem.pem.cc'>a</a>
  <a href='http://azlaw.azlaw.cc'>a</a>
  <a href='http://koptalk.koptalk.cc'>a</a>
  ),
  '142.0.132.124' => array (
  <a href='http://fdis.fdis.cc'>a</a>
  <a href='http://elook.elook.cc'>a</a>
  <a href='http://cropcircles.cropcircles.cc'>a</a>
  <a href='http://divinegrace.divinegrace.cc'>a</a>
  <a href='http://metrowest.metrowest.cc'>a</a>
  <a href='http://ltmp3.ltmp3.cc'>a</a>
  ),
  '198.100.102.142' => array (
  <a href='http://zhupa.zhupa.cc'>a</a>
  <a href='http://qimiao.qimiao.cc'>a</a>
  <a href='http://55125.55125.cc'>a</a>
  <a href='http://kuniu.kuniu.cc'>a</a>
  <a href='http://q520.q520.cc'>a</a>
  <a href='http://wwoo.wwoo.cc'>a</a>
  <a href='http://51dl.51dl.cc'>a</a>
  <a href='http://pincool.pincool.cc'>a</a>
  <a href='http://wenxiu.wenxiu.cc'>a</a>
  <a href='http://cjia.cjia.cc'>a</a>
  ),
  '198.100.102.155' => array (
  <a href='http://nanjin.nanjin.cc'>a</a>
  <a href='http://ios6.ios6.cc'>a</a>
  <a href='http://shop8.shop8.cc'>a</a>
  <a href='http://dayoo.dayoo.cc'>a</a>
  <a href='http://pindu.pindu.cc'>a</a>
  <a href='http://heyu.heyu.cc'>a</a>
  <a href='http://gujia.gujia.cc'>a</a>
  <a href='http://shining.shining.cc'>a</a>
  <a href='http://xrs.xrs.cc'>a</a>
  <a href='http://sqy.sqy.cc'>a</a>
  )
   
   

意图

定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中。

场景

上次,我们使用抽象工厂解决了生产一组产品的问题,但是我们把各个场景作为了具体工厂来生产场景模式和场景纹理两个产品。在调用代码中也并没有出现具体工厂的影子。其实,场景类要做的不仅仅是创建具体的产品系列,可能它还需要做一个初始化工作。那么,我们就需要在调用代码中能得到这个场景类。

在前一节中,由于场景类(比如HalfPaper)本身是具体级别的(具体工厂)。那么,我们也不应该在调用代码中直接依赖场景类。因此,我们可以使用工厂方法来生产这个具体产品。

示例代码

using System;

using System.Reflection;

namespace FactoryMethodExample

{

class
Program

{

static
void Main(
string[] args)

{

Patrix patrix =
new
Patrix();

patrix.LoadScene(
"HalfPaper");

patrix.LoadScene(
"Matrix");

}

}

class
Patrix

{

private
PatrixSceneFactory GetGameScene(
string gameSceneName)

{

return (
PatrixSceneFactory)
Assembly.Load("FactoryMethodExample").CreateInstance(
"FactoryMethodExample." + gameSceneName +
"Factory");

}

public
void LoadScene(
string gameSceneName)

{

PatrixSceneFactory psf = GetGameScene(gameSceneName);

PatrixScene ps = psf.CreateScene();

ps.InitScene();

}

}

abstract
class
PatrixSceneFactory

{

public
abstract
PatrixScene CreateScene();

}

abstract
class
PatrixScene

{

public
void InitScene()

{

Texture texture = CreateTexture();

Model model = CreateModel();

model.FillTexture(texture);

}

public
abstract
Model CreateModel();

public
abstract
Texture CreateTexture();

}

abstract
class
Model

{

public
abstract
void FillTexture(
Texture texture);

}

abstract
class
Texture

{

}

class
HalfPaperFactory :
PatrixSceneFactory

{

public
override
PatrixScene CreateScene()

{

return
new
HalfPaper();

}

}

class
HalfPaper :
PatrixScene

{

public HalfPaper()

{

Console.WriteLine("HalfPaper Creating");

}

public
override
Model CreateModel()

{

return
new
HalfPaperModel();

}

public
override
Texture CreateTexture()

{

return
new
HalfPaperTexture();

}

}

class
HalfPaperModel :
Model

{

public HalfPaperModel()

{

Console.WriteLine("HalfPaper Model Creating");

}

public
override
void FillTexture(
Texture texture)

{

Console.WriteLine("HalfPaper Model is filled Texture");

}

}

class
HalfPaperTexture :
Texture

{

public HalfPaperTexture()

{

Console.WriteLine("HalfPaper Texture Created");

}

}

class
MatrixFactory :
PatrixSceneFactory

{

public
override
PatrixScene CreateScene()

{

return
new
Matrix();

}

}

class
Matrix :
PatrixScene

{

public Matrix()

{

Console.WriteLine("Matrix Created");

}

public
override
Model CreateModel()

{

return
new
MatrixModel();

}

public
override
Texture CreateTexture()

{

return
new
MatrixTexture();

}

}

class
MatrixModel :
Model

{

public MatrixModel()

{

Console.WriteLine("Matrix Model Created");

}

public
override
void FillTexture(
Texture texture)

{

Console.WriteLine("Matrix Model is filled Texture");

}

}

class
MatrixTexture :
Texture

{

public MatrixTexture()

{

Console.WriteLine("Matrix Texture Created");

}

}

}

代码执行结果如下图:

代码说明

l 这个代码基于前一节抽象工厂的代码修改而来,因此代码比较厂。其中能体现的设计模式有抽象工厂、工厂方法以及模版方法。

l 这次的PatrixSceneFactory和前一节的不同,它是一个产品的抽象工厂,也就是工厂方法模式中的抽象工厂角色,它是具体产品工厂的抽象形式。

l HalfPaperFactory和MatrixFactory是工厂方法模式中的具体工厂角色,它负责创建具体的产品。

l PatrixScene是工厂方法模式中的抽象产品角色,同时也是抽象工厂模式中的抽象工厂角色。它既是场景的抽象形式,又负责创建每个场景中的产品系列,也就是模型和纹理。还有,它的InistScene()方法还体现了模版方法的思想,封装了产品初始化过程中的共同步骤。

l HalfPaper和Matrix当然就是工厂方法模式中的具体产品角色了,同时,它们也是抽象工厂模式中的具体工厂角色。

l 从这个例子可以看出,抽象工厂针对一组产品的创建进行抽象,抽象程度比较高。抽象工厂生产重点在于规范一组产品的创建,能让产品线保持产品的一致。比如,N卡不管是7系列还是8系列,总会分低端的7300,8300和中端的7600,8600以及高端的7900,8900。

l 而工厂方法针对某种产品的创建,每种产品在创建的过程中可能会有一些相似的步骤,那么就可以在抽象产品中进行一些提取,自然而然运用到了模版方法。工厂方法还能针对具体产品创建时的易变性,在这里我们可能很清楚HalfPaperFactory一定会创建HalfPaper这个产品,但是万一以后改为创建HalfPaperSpecial了呢?有了工厂方法,我们可以只需修改HalfPaperFactory就可以了。

l 不管怎么样,目的还是让调用方尽量和接口依赖(或者说和稳定的东西去依赖,让变化在接口下面变),既是要以来具体类型,也希望能只依赖一个。试想一下,如果没有抽象工厂和工厂方法,也少了这些抽象类型,那么调用方可能就要依赖具体场景类型和具体的纹理以及模型类型。并且在调用的时候,通过条件来判断并且创建各种具体类型,一旦有新的场景需要实现,调用方代码可能就需要做很大的调整。暂且不说调整的工作量有多少,调整所带来的风险谁能承担呢?

何时采用

l 从代码角度来说, 如果我们需要创建一个易变的对象,或是希望对象由子类决定创建哪个对象的时候可以考虑工厂方法。

l 从应用角度来说, 如果我们觉得具体产品的创建不稳定,或者客户端根本无需知道创建哪个具体产品的时候可以使用工厂方法。后者对于框架和工具包软件来说更常见,比如有一个打印类负责打印图纸,我们需要得到一个打印对象,对于调用方来说并不知道要使用超宽打印对象还是普通打印对象,我们可以通过工厂方法使客户端和抽象打印工厂直接沟通,由它来决定具体创建哪个打印对象。

实现要点

l 通过继承创建具体产品。很多时候,每一种具体产品对应一个具体的工厂来创建。

l 使用具体工厂类来决定怎么样创建具体产品。调用方并不关心工厂创建的是哪个游戏场景,它只用知道工厂给我的是一个游戏场景即可。

注意事项

l 工厂方法通常需要为每个具体产品对应一个具体工厂,如果滥用的话会使得类的数目急剧增多。

转载于:https://www.cnblogs.com/gnhao/archive/2013/01/24/2875124.html

(原创)无废话C#设计模式之四:Factory Method相关推荐

  1. (原创)无废话C#设计模式之二十二:总结(针对GOF23)

    无废话C#设计模式之二十二:总结(针对GOF23) 比较 设计模式 常用程度 适用层次 引入时机 结构复杂度 Abstract Factory 比较常用 应用级 设计时 比较复杂 Builder 一般 ...

  2. (原创)无废话C#设计模式之十二:Bridge

    无废话C#设计模式之十二:Bridge 意图 将抽象部分与实现部分分离,使它们都可以独立的变化. 场景 还是说我们要做的网络游戏,多个场景需要扩充的问题我们已经采用了创建型模式来解决.现在的问题就是, ...

  3. (原创)无废话C#设计模式之十一:Composite

    无废话C#设计模式之十一:Composite 意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性. 场景 ...

  4. (原创)无废话C#设计模式之十九:Observer

    无废话C#设计模式之十九:Observer 意图 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新. 场景 这次不说游戏了,假设我们需要在一个W ...

  5. (原创)无废话C#设计模式之十七:Chain Of Resp.

    无废话C#设计模式之十七:Chain Of Resp. 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象能处理 ...

  6. 设计模式-Factory Method Pattern

    为什么80%的码农都做不了架构师?>>>    一. 工厂方法(Factory Method)模式 工厂方法(FactoryMethod)模式是类的创建模式,其用意是定义一个创建产品 ...

  7. 设计模式04——Factory Method模式

    定义 本系列文章<设计模式>中有一篇<设计模式03--Template Method模式>,在Template Method模式中,我们在父类中规定程序的处理流程,而在子类中实 ...

  8. 设计模式之四-Factory模式

    简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型,工厂类就会返回需要的产品类,但客户端看到的只是产品的抽象对象,无需关心到 ...

  9. 设计模式之工厂方法模式(Factory Method)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...

最新文章

  1. android 类加载器 DexClassLoader的用法,以及引出的插件架构
  2. Codeforces Round #499 (Div. 2) Problem-A-Stages(水题纠错)
  3. c语言测试1到3章,2013计算机等级考试二级《C语言》复习:第三章第1节
  4. Longest k-Good Segment CodeForces - 616D(尺取法)
  5. css html5360百科,div+css
  6. 现代软件工程 期中/期末总结博客作业
  7. java jmeter_使用Jmeter中的Java Request进行性能测试
  8. android禁用应用组件,Android彻底退出(关闭)应用程序.docx
  9. odoo10参考系列--ORM API 三(字段、继承与扩展、域和更新到新API)
  10. [JS进阶] JS 之Blob 对象类型
  11. php _line_,php基本语法
  12. jmeter-正则表达式提取器
  13. 每次循环都会创建新的数组,导致内存占用过多
  14. Apache的网页与安全优化
  15. 2022年智慧城市行业概括及现状
  16. CAD制图初学入门:CAD软件中属性定义的相关应用
  17. 三维激光扫描后处理软件_三维激光扫描——钢结构形变检测的利器
  18. 金山毒霸11,更新内容,问题修复了什么?
  19. 命令提示符之常用命令
  20. Android 设置APP桌面图标

热门文章

  1. 第五章 万无一失:网站的高可用架构(待续)
  2. pscp上传文件至服务器
  3. vue使用 element-ui 禁止 DateTimePicker 选择时间
  4. 优思学院|六西格玛黑带大师MBB是什么?兩大认证比较
  5. 0040.大家来找茬(二).VIP课程
  6. 研发人员考核与激励学习总结
  7. bosun_与Bosun一起监控
  8. 2035年会证实外星人存在?或许是任重道远的探索
  9. Linux LCD屏幕驱动调参实操
  10. [小程序开发] silk 转 MP3 ,第三步