C# 设计模式系列教程-简单工厂模式

1. 概述:

  将一个具体类的实例化交给一个静态工厂方法来执行,它不属于GOF的23种设计模式,但现实中却经常会用到

2. 模式中的角色

  2.1 工厂类(Simple Factory): 只包含了创建具体类的静态方法。

  2.2 抽象产品(Product):定义简单工厂中要返回的产品。

  2.3 具体产品(ConcreteProduct):具体产品。

3. 模式解读

  3.1 简单工厂模式的一般化类图

  3.2 简单工厂模式的代码实现

 /// <summary>
 /// 简单工厂类,用sealed修饰,
 /// </summary>
 public class SimpleProductFactory
 {
  /// <summary>
  /// 使用静态方法,根据传入的参数来指定要实例化哪一种产品
  /// </summary>
  /// <param name="productType"></param>
  /// <returns></returns>
  public static Product CreateProduct(string productType)
  {
   Product product = null;
   switch (productType)
   {
    case "A":
     product = new ConcreteProductA();
     break;
    case "B":
     product = new ConcreteProductB();
     break;
   }

   return product;
  }
 }

 /// <summary>
 /// 抽象产品
 /// </summary>
 public abstract class Product
 {
  public Product()
  { }

  public abstract void Opration();
 }

 /// <summary>
 /// 具体产品 A
 /// </summary>
 public class ConcreteProductA : Product
 {
  public ConcreteProductA() { }

  public override void Opration()
  {
   // 产品A
  }
 }

 /// <summary>
 /// 具体产品 B
 /// </summary>
 public class ConcreteProductB : Product
 {
  public ConcreteProductB() { }

  public override void Opration()
  {
   //产品B
  }
 }

4. 模式总结

  4.1 优点:
    4.1.1 职责单一,实现简单,且实现了客户端代码与具体实现的解耦。

    4.1.2 工厂类是整个模式的关键.包含了必要的逻辑判断,根据外界给定的信息,决定究竟应该创建哪个具体类的对象.

    4.1.3 通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面摆脱出来,仅仅需要负责“消费”对象就可以了。而不必管这些对象究竟如何创建及如何组织的.

    4.1.4 明确了各自的职责和权利,有利于整个软件体系结构的优化。
  4.2 缺点:
    4.2.1 由于工厂类集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。因此它是违背开放封闭原则的。
    4.2.2 当系统中的具体产品类不断增多时候,可能会出现要求工厂类根据不同条件创建不同实例的需求.这种对条件的判断和对具体产品类型的判断交错在一起,很难避免模块功能的蔓延,对系统的维护和扩展非常不利;
    注:这些缺点在工厂方法模式中得到了一定的克服。
  4.3 使用场景:
    4.3.1 工厂类负责创建的对象比较少;
    4.3.2 客户只知道传入工厂类的参数,对于如何创建对象(逻辑)不关心;
    4.3.3 由于简单工厂很容易违反高内聚责任分配原则,因此一般只在很简单的情况下应用。

以上就是本文的全部内容,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C# 设计模式系列教程-装饰模式

    1. 概述 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更灵活. 原理:增加一个修饰类包裹原来的类,包裹的方式一般是通过在将原来的对象作为修饰类的构造函数的参数.装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法.修饰类必须和原来的类有相同的接口. 2. 模式中的角色 2.1 抽象构建(Component):定义一个抽象接口,用以给这些对象动态地添加职责. 2.2 具体构建(ConcreteComponent):定义一个具体的对象,也可以

  • C# 设计模式系列教程-抽象工厂模式

    1. 概述 抽象工厂模式为一个产品家族提供了统一的创建接口.当需要这个产品家族的某一系列的时候,可以从抽象工厂中选出相对应的系列来创建一个具体的工厂类别. 2. 抽象工厂模式中的角色 2.1 抽象工厂(AbstractFactory):担任这个角色的是工厂方法模式的核心,它是与应用系统商业逻辑无关的. 2.2 具体工厂(ConcreteFactory):这个角色直接在客户端的调用下创建产品的实例.这个角色含有选择合适的产品对象的逻辑,而这个逻辑是与应用系统的商业逻辑紧密相关的. 2.3 抽象产品

  • C# 设计模式系列教程-代理模式

    1. 概述 为其它对象提供一种代理以控制对这个对象的访问. 解决的问题:如果直接访问对象比较困难,或直接访问会给使用者或系统带来一系列问题.这样对于客户端(调用者)来说,就不需要直接与真实对象进行交互,解除了调用者与真实对象的耦合. 2. 模式中的角色 2.1 抽象实体(Subject):定义了真实实体(RealSubject)和代理(Proxy)的公共接口,这样就在任何时候使用真实实体(RealSubject)的地方使用代理(Proxy). 2.2 代理(Proxy):保存一个引用使得代理可以

  • C# 设计模式系列教程-原型模式

    1. 概述 通过复制一个已经存在的实例来创建一个新的实例.被复制的实例被称为原型,这个原型是可定制的. 2. 模式中的角色 2.1 抽象原型类(Abstract Prototype):提供一个克隆接口 2.2 具体原型类(Concrete Prototype): 及实现了克隆接口的具体原型类 3. 实例:求职网站上现在都支持多份简历,如果每创建一份简历都要从头至尾地填写一遍,那也是非常让人沮丧的事.其实针对我们的求职岗位的不同,不同的简历可能只要修改局部内容就可以了,而不用全部重新构建一份新的简

  • C# 设计模式系列教程-单例模式

    1. 描述: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 2. 单例模式主要有3个特点,: 2.1 单例类确保自己只有一个实例. 2.2 单例类必须自己创建自己的实例. 2.3 单例类必须为其他对象提供唯一的实例. 3. 实现方式:懒汉单例类和饿汉单例类 3.1 懒汉式单例类 对于懒汉模式,我们可以这样理解:该单例类非常懒,只有在自身需要的时候才会行动,从来不知道及早做好准备.它在需要对象的时候,才判断是否已有对象,如果没有就立即创建一个对象,然后返回,如果已有对象就不再创建,立即返

  • C# 设计模式系列教程-策略模式

    在讲策略模式之前,我先给大家举个日常生活中的例子,从首都国际机场到XXX酒店,怎么过去?1)酒店接机服务,直接开车来接.2)打车过去.3)机场快轨+地铁 4)机场巴士 5)公交车 6)走路过去(不跑累死的话) 等等.使用方法,我们都可以达到从机场到XXX酒店的目的,对吧.那么我所列出的从机场到XXX酒店的的方法,就是我们可以选择的策略. 再举个例子,就是我们使用WCF时,往往避免不了对它进行扩展,例如授权,我们可以通过自定义授权来扩展WCF.这里我们可以通过自定义AuthorizationPol

  • C# 设计模式系列教程-建造者模式

    1. 概述 将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式. 2. 建造者模式中的角色 2.1 建造者(Builder):为创建一个产品对象的各个部件指定抽象接口. 2.2 具体建造者(ConcreteBuilder):实现Builder的接口以构造和装配该产品的各个部件,定义并明确它所创建的表示,并 提供一个检索产品的接口. 2.3 指挥者(Director):指挥并构造一个使用Builder接口的对象. 2.4 产品(Product):

  • 详解C#的设计模式编程之抽象工厂模式的应用

    这里首先以一个生活中抽象工厂的例子来实现一个抽象工厂,然后再给出抽象工厂的定义和UML图来帮助大家更好地掌握抽象工厂模式,同时大家在理解的时候,可以对照抽象工厂生活中例子的实现和它的定义来加深抽象工厂的UML图理解.抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例. 抽象工厂模式比其它工厂模式更加抽象,抽象工厂模式适用与多个抽象类的情况下,通过工厂返回多个抽象类中你需要得到的具体子类实例. 举例阐述抽象工厂模式: 假如中国

  • C# 设计模式系列教程-桥接模式

    1. 概述 将抽象部分(Abstraction)与实现部分(Implementor)分离,使它们可以独立地变化. 2. 解决的问题 在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化.为了解决这种多维度变化,又不引入复杂度,这就要使用Bridge模式. 3. 模式中的角色 2.1 抽象(Abstraction):定义抽象接口,该接口中包含实现具体行为.具体特征的Implementor接口. 2.2 提炼的抽象(RefinedAbstraction):继承自Abstraction的子

  • C# 设计模式系列教程-工厂方法模式

    1. 概述: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到子类. 2. 模式中的角色 2.1 抽象工厂(Creator):这个抽象类(或接口)声明一个创建对象的工厂方法,用来返回一个Product类型的对象. 2.2 具体工厂(ConcreteCreator):重定义工厂方法,返回一个具体的Concrete Product实例. 2.3 抽象产品(Product):定义工厂方法所创建的对象. 2.4 具体产品(ConcreteProduct): 具体产品,

随机推荐