• 设计模式学习笔记-简单工厂模式


    工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不
    必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:
    • 简单工厂(Simple Factory)模式
    • 工厂方法(Factory Method)模式
    • 抽象工厂(Abstract Factory)模式
    一、 简单工厂(Simple Factory)模式
    Simple Factory模式根据提供给它的数据,返回几个可能类中的一个类的实例。通常它返回的
    类都有一个公共的父类和公共的方法。
    Simple Factory模式实际上不是GoF 23个设计模式中的一员。
    二、Simple Factory模式角色与结构:
    工厂类角色Creator (LightSimpleFactory):工厂类在客户端的直接控制下(Create方法)
    创建产品对象。
    抽象产品角色Product (Light):定义简单工厂创建的对象的父类或它们共同拥有的接口。可以
    是一个类、抽象类或接口。
    具体产品角色ConcreteProduct (BulbLight, TubeLight):定义工厂具体加工出的对象。
    三、 程序举例:

    usingSystem; 
    public abstract classLight 
    { 
    public abstract voidTurnOn(); 
    public abstract voidTurnOff(); 
    } 
    public classBulbLight : Light 
    { 
    public override voidTurnOn() 
    { 
    Console.WriteLine("Bulb Light is Turned on"); 
    } 
    public override voidTurnOff() 
    { 
    Console.WriteLine("Bulb Light is Turned off"); 
    } 
    } 
    public classTubeLight : Light 
    { 
    public override voidTurnOn() 
    { 
    Console.WriteLine("Tube Light is Turned on"); 
    } 
    public override voidTurnOff() 
    { 
    Console.WriteLine("Tube Light is Turned off"); 
    } 
    } 
    public classLightSimpleFactory 
    { 
    publicLight Create(stringLightType) 
    { 
    if(LightType == "Bulb") 
    return newBulbLight(); 
    else if(LightType == "Tube") 
    return newTubeLight(); 
    else
    return null; 
    } 
    } 
    public classClient 
    { 
    public static voidMain() 
    { 
    LightSimpleFactory lsf = newLightSimpleFactory(); 
    Light l = lsf.Create("Bulb"); 
    l.TurnOn(); 
    l.TurnOff(); 
    Console.WriteLine("-----------------"); 
    l = lsf.Create("Tube"); 
    l.TurnOn(); 
    l.TurnOff(); 
    } 
    }
    View Code

    四、Simple Factory模式演化
    Simple Factory模式演化(一)
    除了上面的用法外,在有些情况下Simple Factory可以由抽象产品角色扮演,一个抽象产品类
    同时是子类的工厂。
    程序举例:

     1 usingSystem; 
     2 public classLight 
     3 { 
     4 public virtual voidTurnOn() 
     5 { 
     6 } 
     7 public virtual voidTurnOff() 
     8 { 
     9 } 
    10 public staticLight Create(stringLightType) 
    11 { 
    12 if(LightType == "Bulb") 
    13 return newBulbLight(); 
    14 else if(LightType == "Tube") 
    15 return newTubeLight(); 
    16 else
    17 return null; 
    18 } 
    19 } 
    20 public classBulbLight : Light 
    21 { 
    22 public override voidTurnOn() 
    23 { 
    24 Console.WriteLine("Bulb Light is Turned on"); 
    25 } 
    26 public override voidTurnOff() 
    27 { 
    28 Console.WriteLine("Bulb Light is Turned off"); 
    29 } 
    30 } 
    31 public classTubeLight : Light 
    32 { 
    33 public override voidTurnOn() 
    34 { 
    35 Console.WriteLine("Tube Light is Turned on"); 
    36 } 
    37 public override voidTurnOff() 
    38 { 
    39 Console.WriteLine("Tube Light is Turned off"); 
    40 } 
    41 } 
    42 public classClient 
    43 { 
    44 public static voidMain() 
    45 { 
    46 Light l = Light.Create("Bulb"); 
    47 l.TurnOn(); 
    48 l.TurnOff(); 
    49 Console.WriteLine("-----------------"); 
    50 l = Light.Create("Tube"); 
    51 l.TurnOn(); 
    52 l.TurnOff(); 
    53 } 
    54 }
    View Code

    Simple Factory模式演化(二)
    三个角色全部合并:
    与单件模式(Singleton)相近,但是有区别。
    五、 优点与缺点:
    优点:
    工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直
    接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。
    缺点:
    当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂
    类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。
    同时,系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂。
    另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基
    于继承的等级结构。

  • 相关阅读:
    静态页面设置缓存、动态页面设缓存
    未能加载文件或程序集“WebGrease, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
    CS0016: 未能写入输出文件“c:WindowsMicrosoft.NETFrameworkv4.0.30319Temporary ASP.NET Files
    asp.net mvc 重定向
    win8 应用商店。 app下载的音乐和视频软件能打开,不能正常播放 解决方法
    JS 阻止事件冒泡
    ASP.NET MVC4空MVC项目添加脚本压缩和合并
    TabHost说明
    colors.xml
    MMU (一)
  • 原文地址:https://www.cnblogs.com/tofight/p/3394248.html
Copyright © 2020-2023  润新知