zoukankan      html  css  js  c++  java
  • 23种设计模式之工厂方法(Factory Method Pattern)

    工厂方法

    前面我们学习了简单工厂,发现一个问题就是简单工厂集合了矛盾,为了解决这个问题我们针对每一种产品提供一个工厂类。通过不同的工厂实例来创建不同的产品实例。在同一等级结构中,支持增加任意产品这种设计模式就是工厂方法。

    优点:允许系统在不修改具体工厂角色的情况下引进新产品

    缺点:由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量

    1     public interface IFactory
    2     {
    3         IRace CreateRace();
    4     }
    View Code
     1    public class HumanFactory : IFactory
     2     {
     3         public virtual IRace CreateRace()
     4         {
     5             return new Human();
     6         }
     7     }
     8     public class HumanFactoryAdvanced: HumanFactory
     9     {
    10         public override IRace CreateRace()
    11         {
    12             Console.WriteLine("123");
    13             return new Human();
    14         }
    15     }
    View Code
    1     public class NEFactory : IFactory
    2     {
    3         public IRace CreateRace()
    4         {
    5             return new NE();
    6         }
    7     }
    View Code
    1     public class ORCFactory : IFactory
    2     {
    3         public IRace CreateRace()
    4         {
    5             return new ORC();
    6         }
    7     }
    View Code
    1     public class UndeadFactory : IFactory
    2     {
    3         public IRace CreateRace()
    4         {
    5             return new Undead();
    6         }
    7     }
    View Code

    前端调用

     1                {
     2                     Human human = new Human();//1 到处都是细节
     3                 }
     4                 {
     5                     IRace human = new Human();//2 左边是抽象  右边是细节
     6                 }
     7                 {
     8                     //human.
     9                     IFactory factory = new HumanFactory();//包一层
    10                     IRace race = factory.CreateRace();
    11                     //何苦  搞了这么多工厂 还不是创建个对象
    12                     //以前依赖的是Human  现在换成了HumanFactory
    13 
    14                     //1 工厂可以增加一些创建逻辑  屏蔽对象实例化的复杂度
    15                     //2 对象创建的过程中  可能扩展(尤其是ioc)
    16                 }
    17                 {
    18                     //Undead
    19                     IFactory factory = new UndeadFactory();
    20                     IRace race = factory.CreateRace();
    21                 }
    View Code

    工厂方法:把简单工厂拆分成多个工厂,保证每个工厂的相对稳定
    但是要多new一次工厂? 难免,中间层,屏蔽业务类变化的影响,而且可以留下创建对象的扩展空间=>eg:HumanFactoryAdvanced 在创建对象之前执行一些操作

    开闭原则:对扩展开发,对修改封闭
    工厂方法完美遵循了开闭原则

    工厂方法的好处就是对于拓展很方便例如增加第五种族

     1     /// <summary>
     2     /// 比如构造很复杂。。比如依赖其他对象
     3     /// 屏蔽变化
     4     /// </summary>
     5     public class FiveFactory : IFactory
     6     {
     7         public virtual IRace CreateRace()
     8         {
     9 
    10             //return new Five();
    11             return new Five(2, "New", 2);
    12         }
    13     }
    View Code

    前端调用

    1                {
    2                     IRace five = new Five();//修改
    3                 }
    4 
    5                 {
    6                     //five
    7                     IFactory factory = new FiveFactory();
    8                     IRace race = factory.CreateRace();
    9                 }
    View Code

    简单工厂与工厂方法

            工厂方法模式是简单工厂模式的进一步抽象和推广,由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,并且克服了它的缺点,完全符合开闭原则

  • 相关阅读:
    xfire webServeic 例子
    Spring3 url匹配规则
    js 字符串转化成数字
    JS回车事件,兼容目前所有浏览器
    笔记:Zygote和SystemServer进程启动过程
    安卓Task和Back Stack
    札记:Property动画
    札记:翻译-使用Scene和Transition实现【场景切换】动画效果
    算法:排序
    [BOT]自定义ViewPagerStripIndicator
  • 原文地址:https://www.cnblogs.com/Dewumu/p/11430725.html
Copyright © 2011-2022 走看看