当前位置: 首页 > news >正文

c#工厂模式与抽象工厂模式

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

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

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

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

Factory Method模式中,工厂类与产品类往往具有平行的等级结构,它们之间一一对应。

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

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

具体工厂(Concrete Creator)角色:这是实现抽象工厂接口的具体工厂类,包含与应用程序密切相关的逻辑,并且受到应用程序调用以创建产品对象。

抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。

具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所定义的接口。某具体产品有专门的具体工厂创建,它们之间往往一一对应。

 

 工厂模式与抽象工厂模式是应用得比较多的构造型模式,先简单的介绍一下这种构造模式的应用背景:
        在开发一个类的过程中,我们一般都要为这个类开发相应的构造函数(不过大部分情况下,.NET开发环境会自动默认创建构造函数),这样,使用这个类的客户可以利用构造函数对这个类进行实例化.但是,有时候会出现这种情况:需要使用一个对象的客户并不知道(或者不应该知道)应该对几个类中的哪个类进行初始化.面对这个问题,我们可以利用工厂模式定义一个接口,客户可以使用这个接口创建一个对象.同时我们还可以控制对哪个类进行实例化,实例化过程使用了一个方法,这个方法需要利用外部因素来确定对哪个类进行实例化.有时候,这些外部因素就是一个庞大的研究主题,并且往往会涉及到多个类.为此,抽象工厂模式就应用于这种场合,其目的是为了 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类 ,至少 无需指定它们具体的类 符合我们的要求。
  下面就Gof's Design Pattern Framework2.0中的一个UML class diagram及一个通俗易懂的例子来说明一下:

 
        这个图比较形象直观,能很清楚的看出抽象工厂与工厂以及客户之间的关系.
  下面就举个例子来看看:
         假如我的程序中有需要一系列的对象,比如bed,desk,chair…, 要想利用他们,我们就必须在程序中根据用户要求,然后一个个调用 new 操作符来生成他们,这样客户程序就要知道相应的类的信息,生成的代码显然不够灵活。再此它们显然是一类的,都是furniture,既然如此,我们只要一个生产家具的工厂就可以.我们可以在代码中不利用具体的类,而只是说明我们需要什么,然后就能够得到我们想要的对象.
先定义一个类,主要声明一个家具接口,床和椅子的类:
Public  interface  IFurniture
{
}
public   class  Bed:IFurniture
{
 
public  Bed()
 {
  Console.WriteLine(
"I need a bed ! " );
 }
}
public   class  Desk:IFurniture
{
 
public  Desk()
 {
  Console.WriteLine(
"I need a desk ! " );
 }
}
public class Chair:IFurniture
{
 
public Chair()
 {
  Console.WriteLine(
"I need a chair!");
 }
}
再定义一个家具工厂的类(可以利用反射机制中Type类获取Name指定的类名的类的Type信息,然后可以根据这个信息利用System.Activator创建对象):
public class FurnitureFactory
{
 
public IFurniture MakeFurniture(string Name)
 {
  IFurniture MyFurniture 
= null;
try
  {
   Type type 
= Type.GetType(Name,true);
   MyFurniture 
= (IFurniture)Activator.CreateInstance(type);
  }
catch (TypeLoadException e)
   Console.WriteLine(
"I dont know this kind of furniture,
      exception caught - {0}" ,e.Message);
return MyFurniture;
 }
}
然后在以客户端进行程序调用:
string FurnitureName = Console.ReadLine();
IFurniture MyFurniture;
FurnitureFactory MyFurnitureFactory 
= new FurnitureFactory();
MyFurniture 
= MyFurnitureFactory.MakeFurniture(FurnitureName);
  就这样预期想实现的,通过这样就实现了.当然这个例子比较简单,但是它却通过工厂模式的思想实现了代码的灵活性.应用软件系统开发中,有许多地方可以考虑使用工厂模式.比如在写数据层的代码时候,考虑到程序的可移植性,可拓展性,面向不同的数据库时,采用工厂模式不为是一件理想的实现方式.
 

转载于:https://www.cnblogs.com/wwwzzg168/p/3570146.html

相关文章:

  • 江南style之---黄山
  • Linux服务器操作系统基础篇
  • 网卡及MAC和PHY的区别
  • 终端I/O之终端标识
  • Hadoop中MapReduce获取命令行参数例子(11)
  • 得到Revit子窗体
  • linux命令行抓取网页快照-(xvfb+CutyCapt)
  • 在eclipse里的 flex 没有可视化的编辑
  • iOS的动态代理模式的实现
  • 关于volatile
  • 通过vbs脚本备份数据-本地到异地
  • 动态SQL和静态SQL
  • hadoop集群监控工具ambari安装
  • MVC 区分是哪按键提交FORM
  • UML画图总结以及浅谈UNL九种图
  • 【347天】每日项目总结系列085(2018.01.18)
  • Docker容器管理
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • PHP 的 SAPI 是个什么东西
  • windows-nginx-https-本地配置
  • 和 || 运算
  • 理解在java “”i=i++;”所发生的事情
  • 使用 Xcode 的 Target 区分开发和生产环境
  • 我感觉这是史上最牛的防sql注入方法类
  • 终端用户监控:真实用户监控还是模拟监控?
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • ​低代码平台的核心价值与优势
  • ​决定德拉瓦州地区版图的关键历史事件
  • #NOIP 2014# day.2 T2 寻找道路
  • (1)常见O(n^2)排序算法解析
  • (bean配置类的注解开发)学习Spring的第十三天
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (ros//EnvironmentVariables)ros环境变量
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二十三)Flask之高频面试点
  • (离散数学)逻辑连接词
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (入门自用)--C++--抽象类--多态原理--虚表--1020
  • (一)WLAN定义和基本架构转
  • *** 2003
  • ****Linux下Mysql的安装和配置
  • ..回顾17,展望18
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .Net 中Partitioner static与dynamic的性能对比
  • .net 中viewstate的原理和使用
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .net访问oracle数据库性能问题
  • .net快速开发框架源码分享
  • @ 代码随想录算法训练营第8周(C语言)|Day53(动态规划)
  • @Not - Empty-Null-Blank
  • @property @synthesize @dynamic 及相关属性作用探究
  • [] 与 [[]], -gt 与 > 的比较