工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:

  • 简单工厂(Simple Factory)模式
  • 工厂方法(Factory Method)模式
  • 抽象工厂(Abstract Factory)模式

一、 简单工厂(Simple Factory)模式

Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的类都有一个公共的父类和公共的方法。

Simple Factory模式实际上不是GoF 23个设计模式中的一员。

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

工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)创建产品对象。

抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以是一个类、抽象类或接口。

具体产品角色ConcreteProduct (BulbLight, TubeLight):定义工厂具体加工出的对象。

三、 程序举例:

using System;

public abstract class Light
{
   public abstract void TurnOn();
   public abstract void TurnOff();
}

public class BulbLight : Light
{
   public override void TurnOn()
   {
      Console.WriteLine("Bulb Light is Turned on");
   }

   public override void TurnOff()
   {
      Console.WriteLine("Bulb Light is Turned off");
   }
}

public class TubeLight : Light
{
   public override void TurnOn()
   {
      Console.WriteLine("Tube Light is Turned on");
   }

   public override void TurnOff()
   {
      Console.WriteLine("Tube Light is Turned off");
   }
}

public class LightSimpleFactory
{
   public Light Create(string LightType)
   {
      if(LightType == "Bulb")
         return new BulbLight();
      else if(LightType == "Tube")
         return new TubeLight();
      else
         return null;
   }
}

public class Client
{
   public static void Main()
   {
      LightSimpleFactory lsf = new LightSimpleFactory();

      Light l = lsf.Create("Bulb");
      l.TurnOn();
      l.TurnOff();

      Console.WriteLine("-----------------");

      l = lsf.Create("Tube");
      l.TurnOn();
      l.TurnOff();
   }
}

四、 Simple Factory模式演化

Simple Factory模式演化(一)

除了上面的用法外,在有些情况下Simple Factory可以由抽象产品角色扮演,一个抽象产品类同时是子类的工厂。

程序举例:

using System;

public class Light
{
   public virtual void TurnOn()
   {
   }

   public virtual void TurnOff()
   {
   }

   public static Light Create(string LightType)
   {
      if(LightType == "Bulb")
         return new BulbLight();
      else if(LightType == "Tube")
         return new TubeLight();
      else
         return null;
   }
}

public class BulbLight : Light
{
   public override void TurnOn()
   {
      Console.WriteLine("Bulb Light is Turned on");
   }

   public override void TurnOff()
   {
      Console.WriteLine("Bulb Light is Turned off");
   }
}

public class TubeLight : Light
{
   public override void TurnOn()
   {
      Console.WriteLine("Tube Light is Turned on");
   }

   public override void TurnOff()
   {
      Console.WriteLine("Tube Light is Turned off");
   }
}

public class Client
{
   public static void Main()
   {
      Light l = Light.Create("Bulb");
      l.TurnOn();
      l.TurnOff();

      Console.WriteLine("-----------------");

      l = Light.Create("Tube");
      l.TurnOn();
      l.TurnOff();
   }
}

Simple Factory模式演化(二)

三个角色全部合并:

与单件模式(Singleton)相近,但是有区别。

五、 优点与缺点:

优点:
工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。

缺点:
当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。

另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

C#设计模式(4)-Simple Factory Pattern相关推荐

  1. Net设计模式之简单工厂模式(Simple Factory Pattern)

    一.简单工厂模式简介(Bref Introduction)        简单工厂模式(Simple Factory Pattern)的优点是,工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实 ...

  2. 设计模式(1):简单工厂模式(Simple Factory Pattern)

    1. 从一个简单的例子开始 在众多的设计原则中,有一条原则是这么说的:要针对接口编程,不要针对实现编程. 针对接口编程的话,可以使用不同的实现类来创建这个对象.比如需要一个List: List< ...

  3. 设计模式之简单工厂模式(Simple Factory Pattern)

    什么是简单工厂模式? 以下内容来自 ChatCPT 的回答: 简单工厂模式(Simple Factory Pattern)是一种创建型设计模式,其主要目的是将对象的创建过程封装在一个单独的类中,以便于 ...

  4. 简单工厂模式(Simple Factory Pattern)

    前言 学习难度:★★☆☆☆ 使用频率:★★★☆☆ 学会它. 开始吧 模式名称 中文:简单工厂模式 English: Simple Factory Pattern 含义:简单工厂模式专门定义一个类来负责 ...

  5. 简单工厂模式:Simple Factory Pattern(转自阿良.NET)

    简单工厂(Simple Factory)模式 Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例.通常它返回的类都有一个公共的父类和公共的方法. Simple Fact ...

  6. Understand one Simple Factory Pattern

    Keywords: Factory Pattern, Design Pattern 在网上经常会看到有关Factory Pattern的文章, 今天我也在blog上发表一下对一个非常简单Factory ...

  7. 我的实用设计模式之Simple Factory,Factory Method和Abstract Factory

    更新1:更新Factory Method部分,说明文中使用"参数化工厂方法"的实现,同时加入经典Factory Method的实现进行比较. 更新2:更新Abstract Fact ...

  8. 设计模式-工厂模式 Factory Pattern(简单工厂、工厂方法、抽象工厂)

    工厂模式 Factory Pattern(简单工厂.工厂方法.抽象工厂) 工厂模式-创建型模式-提供了创建对象的最佳方式. 在工厂模式中,创建对象时不会对客户端暴露创建逻辑,并且是通过一个共同的接口来 ...

  9. 秒懂设计模式之简单工厂模式(Simple Factory Pattern)

    版权申明]非商业目的可自由转载 博文地址:https://blog.csdn.net/ShuSheng0007/article/details/86634864 出自:shusheng007 设计模式 ...

最新文章

  1. csgo 人数文件_学生机简单开一个CSGO的社区服务器
  2. 作为一名合格的前端开发工程师需要会哪些
  3. this指向undefined uiapp_JavaScript深入之史上最全5种this绑定全面解析
  4. 150页书籍《PyTorch 深度学习快速入门指南》附PDF电子版
  5. Laravel-admin hasMany表单关联提交报错字段 无详细信息错误说明
  6. Flutter ListView 下拉刷新与上拉加载更多
  7. 你会想待下去吗?世界上25个最惊险的屋顶
  8. c语言删除文件remove_「Python」 - 文件基本操作
  9. Android ANR:executing service com.xxx.yyy/cn.jpush.android.service.PushService
  10. MyBioSource丨人Hif1αelisa试剂盒解决方案
  11. Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location: “/sear
  12. eis系统 java_Java消息系统介绍 - marvin_vov的个人空间 - OSCHINA - 中文开源技术交流社区...
  13. Froyo(Android2.2)移植到Mips平台经验总结
  14. 《极简算法史》读书札记
  15. 十六进制颜色和RGB互转
  16. web3.js查询和修改链上的合约数据
  17. 【Web】html+js 制作小游戏
  18. 四点底“灬”在汉字中的含义
  19. 美化win10 PowerShell
  20. 网络安全·DDoS防护

热门文章

  1. android来电归属地提醒
  2. 区块链扫盲之7,区块链与以太坊
  3. 痞子衡嵌入式:利用GPIO模块来测量i.MXRT1xxx的系统中断延迟时间
  4. TMA三均线股票期货高频交易策略的R语言实现
  5. 使用UltraISO制作U盘启动盘教程
  6. 一个可以扩容C盘的第三方免费软件
  7. 简析Acrel-1000安科瑞变电站综合自动化系统选型与应用
  8. dspace安装及应用
  9. 你开车都有什么小技巧?
  10. java浮点数化为整数_[Java教程]javascript浮点数转换成整数三种方法