首页 > 其他 > 详细

工厂模式(Factory Method Pattern)

时间:2018-01-24 19:30:11      阅读:217      评论:0      收藏:0      [点我收藏+]

模式定义

工厂方法模式(Factory Method Pattern)又称为工厂模式,也叫虚拟构造器(Virtual Constructor)模式或者多态工厂(Polymorphic Factory)模式,它属于类创建型模式。在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生成具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟应该实例化哪一个具体产品类。

UML类图

技术分享图片

  • Product 抽象产品
  • ConcreteProduct 具体产品
  • Factory 抽象工厂
  • ConcreteFactory 具体工厂

    代码结构组成

    public  class FactoryApp
    {
        public static void Run()
        {
            Creator[] creators = new Creator[2];
    
            creators[0] = new ConcreteCreatorA();
            creators[1] = new ConcreteCreatorB();
    
            foreach(Creator creator in creators)
            {
                Product product = creator.FactoryMothed();
                Console.WriteLine("Created {0}", product.GetType().Name);
            }
        }
    }
    
    public class Product
    { }
    public class ConcreteProductA:Product
    { }
    public class ConcreteProductB:Product
    { }
    
    public abstract class Creator
    {
        public abstract Product FactoryMothed();
    }
    
    public class ConcreteCreatorA:Creator
    {
        public override Product FactoryMothed()
        {
            return new ConcreteProductA();
        }
    }
    
    public class ConcreteCreatorB:Creator
    {
        public override Product FactoryMothed()
        {
            return new ConcreteProductB();
        }
    }

    情景案例

    以麦当劳的汉堡为例,假设汉堡有两种牛肉堡和鸡肉堡,不同的汉堡有不同的汉堡厨师制作。
    可能有疑问:为是么是有工厂设计模式呢,反而多个多类更麻烦?
  • 重写大量重复代码: 如果创建厨师类需要复杂的过程,比如验证厨艺水平等等,并不是简单通过new就能完成,那么将这些验证放入工厂会减少重写大量重复代码
  • 容易扩展: 如果再家一个芝士堡只需添加芝士堡类与芝士堡厨师类,满足开闭原则

    public class FactoryApp
    {
        public static void Run()
        {
            BurgerCook[] burgerCook = new BurgerCook[2];
    
            burgerCook[0] = new BeefBurgerCook();
            burgerCook[1] = new ChickenBurgerCook();
    
            foreach (BurgerCook cook in burgerCook)
            {
                Burger burger = cook.MarkBurger();
                Console.WriteLine("Created {0}", burger.GetType().Name);
            }
        }
    }
    
    public class Burger
    { }
    public class BeefBurger : Burger
    { }
    public class ChickenBurger : Burger
    { }
    
    public abstract class BurgerCook
    {
        public abstract Burger MarkBurger();
    }
    
    public class BeefBurgerCook : BurgerCook
    {
        public override Burger MarkBurger()
        {
            return new BeefBurger();
        }
    }
    
    public class ChickenBurgerCook : BurgerCook
    {
        public override Burger MarkBurger()
        {
            return new ChickenBurger();
        }
    }

工厂模式(Factory Method Pattern)

原文:https://www.cnblogs.com/LoveTomato/p/8342947.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!