zoukankan      html  css  js  c++  java
  • c#设计模式-简单工厂

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

    • 简单工厂(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#
    标签: 设计模式
  • 相关阅读:
    python 执行sql得到字典格式数据
    python爬虫 url链接编码成gbk2312格式
    windows环境下elasticsearch安装教程(单节点)
    python SQLServer 存储图片
    爬虫的本质是和分布式爬虫的关系
    requests form data 请求 爬虫
    mysql 删除 binlog 日志文件
    查看mysql数据表的大小
    xshell 连接报错 Disconnected from remote host
    centos 7.3 安装 mysqldb 报错 EnvironmentError: mysql_config not found ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  • 原文地址:https://www.cnblogs.com/kdp0213/p/8547668.html
Copyright © 2011-2022 走看看