设计模式C#实现(八)——工厂方法模式和简单工厂

工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

构成:

1.Product工厂方法创建的对象的接口

2.ConcreteProduct具体的产品,实现Product接口

3.Creator声明工厂方法,返回Product

4.ConcreteCreator实现/重写Creator的工厂方法,返回ConcreteProduct实例

UML类图:

实现

要生产的产品都实现一个接口

interface Product
    {
        string getName();
    }

具体产品实现

  class Phone : Product
    {
        private string name = "MyPhone";
        public string getName()
        {
            return name;
        }
    }

工厂接口

  interface Creator
    {
        Product createProduct();
    }

具体工厂

   class PhoneCreator : Creator
    {
        public Product createProduct()
        {
            return new Phone();
        }
    }

使用

   class Program
    {
        static void Main(string[] args)
        {
            Creator creator = new PhoneCreator();
            Product phone= creator.createProduct();
            Console.WriteLine(phone.getName());
            Console.ReadKey();
        }
    }

效果:

1.客户仅需处理Product接口,而不用知道它的具体实现是什么,符合针对接口编程的OO原则

2.要创建一个ConcreteProduct,就不得不创建一个ConcreteCreator

简单工厂:提供一个类,由它负责根据一定的条件创建某一具体类的实例,简单工厂不是一个设计模式(GOF没提,《HeadFirst设计模式》说像一种编程习惯)

UML类图:

构成:

1.SimpleFactory简单工厂,根据条件(参数)创建并返回一个实例

2. Product产品接口

3.ConcreteProduct具体产品,实现Product接口

以生产披萨为例,因为Pizza有许多不同口味,SimpleFactory根据客户的口味生产不同Pizza

  class SimpleFactory
    {
        public Pizza getPizza(string type)
        {
            switch (type.Trim().ToLower())
            {
                case "cheesepizza":
                    return new CheesePizaa();
                    break;
                case "clampizza":
                    return new ClamPizza();
                    break;
                default:
                    return new NormalPizza();
                    break;
            }
        }

    }

Pizza接口

 abstract class Pizza
    {
        virtual public string getName()
        {
            return "NormalPizza";
        }
    }

不同口味的Pizza

  class CheesePizaa : Pizza
    {
        override public string getName()
        {
            return "CheesePizaa";
        }
    }
 class ClamPizza : Pizza
    {
        override public string getName()
        {
            return "ClamPizza";
        }
    }
class NormalPizza:Pizza
    {

    }

客户选择可以提供条件来获得不同的实例

  class Program
    {
        static void Main(string[] args)
        {
            SimpleFactory factory = new SimpleFactory();
            Pizza cheesePiz = factory.getPizza("CheesePizza");
            Pizza clamPiz = factory.getPizza("ClamPizza");
            Pizza NormalPiz = factory.getPizza("");
            Console.WriteLine(cheesePiz.getName());
            Console.WriteLine(clamPiz.getName());
            Console.WriteLine(NormalPiz.getName());
            Console.ReadKey();
        }
    }

效果:

1.客户不再控制实例的创建,只需要使用,减少了客户的责任(单一责任原则?)

2.多个客户可以使用一个工厂,实现了代码复用

3.当实例的创建方法改变,并不影响客户(封装变化?)

4.当要添加产品就必须修改工厂,工厂方法模式一定程度上弥补了这个缺陷

时间: 2024-10-05 11:47:07

设计模式C#实现(八)——工厂方法模式和简单工厂的相关文章

工厂方法模式和简单工厂模式的选折

开闭原则,其实是要求多站在全局的角度来规划类. 工厂方法模式比简单工程模式要复杂,它对简单工厂进行了进一步的抽象. 抽象是扩展视角,它增加了全局数据维护的负担.类变多了,客户端需要对接更多的一部分类.但是写代码的逻辑结构化了,写代码的人轻松了,调用它的人负担重了. 为了方便调用者,可以套外观模式.但是这样最基础的java代码越来越绕了. 当类越来越多,变化越来越复杂,并需要长期的维护和升级的时候才需要工厂方法模式. 一般情况下只需要简单工厂模式. 工厂方法模式是产品迭代后做的.一方面因为结构已经

简单工厂模式、工厂方法模式和抽象工厂模式-设计模式学习

1.简单工厂模式 简单工厂模式是属于创建型模式,又叫做静态工厂方法(StaticFactory Method)模式,但不属于23种GOF设计模式之一.简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例.简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现. 工厂(Creator)角色 简单工厂模式的核心,它负责实现创建所有实例的内部逻辑.工厂类的创建产品类的方法可以被外界直接调用,创建所需的产品对象. 抽象产品(Product)角色 简单工厂模式所创建的所有

笔记十三:设计模式之简单工厂模式、工厂方法模式、抽象工厂模式

引言: 假设现在有一个超市(Market),超市销售饼干(Biscuit).水果(Fruit).饮料(Drink)三种食品. 按照常规,我们建立三个类:class Biscuit.class Fruit.class Drink. class Biscuit{ public: Biscuit(){} ~Biscuit(){} void Show(){ cout << "Hi,customers! I'm Biscuit!" << endl; } }; class

iOS设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂的生活场景,卖早点的小摊贩,他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂,它生产包子,馒头,地沟油烙的煎饼.该场景对应的UML图如下所示: 图1:简单工厂模式UML图 简单工厂模式的参与者: 工厂(Factory)角色:接受客户端的请求,通过请求负责创建相应的产品对象. 抽象产品(Abstract Product)角色: 是工厂模式所创建对象的父类或是共同拥有的接口.可是抽象类或接口. 具体产品(Conc

设计模式系列——三个工厂模式(简单工厂模式,工厂方法模式,抽象工厂模式)

原文地址:http://blog.chinaunix.net/uid-25958655-id-4243289.html 简单工厂模式 当需要加法类的时候,调用工厂类的CreateOperate(),要指定制造的Product 例如在大话设计模式P11给的运算工厂例子: public static Operation createOperate(string operate) { Operation oper = null; 12 switch (operate) { case "+":

iOS常用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 如何理解简单工厂,工厂方法, 抽象工厂三种设计模式? 简单工厂方法包含:父类拥有共同基础接口,具体子类实现子类特殊功能,工厂类根据参数区分创建不同子类实例.该场景对应的UML图如下所示: 代码结构如下 Animal 类 @interface Animal :NSObject @proterty(nonatomic,strong) NSString *name; -(void)laugh; @end Dog类 @interface Dog:Animal @end Cat类 @i

iOS经常使用设计模式——工厂方法(简单工厂模式,工厂方法模式, 抽象工厂模式)

1. 简单工厂模式 怎样理解简单工厂,工厂方法. 抽象工厂三种设计模式? 简单工厂的生活场景.卖早点的小摊贩.他给你提供包子,馒头,地沟油烙的煎饼等,小贩是一个工厂.它生产包子,馒头,地沟油烙的煎饼. 该场景相应的UML图例如以下所看到的: 图1:简单工厂模式UML图 简单工厂模式的參与者: 工厂(Factory)角色:接受client的请求,通过请求负责创建对应的产品对象. 抽象产品(Abstract Product)角色:是工厂模式所创建对象的父类或是共有的接口.但是抽象类或接口. 详细产品

简单工厂模式,工厂方法模式,抽象工厂模式

简单工厂模式.抽象工厂模式.工厂方法模式,这三种工厂模式都属于设计模式中的创建型模式,它们在形式和特点上也多少有些相似,其最终目的都是帮我们将对象的实例化部分取出来,进而优化系统架构,增强系统的扩展性,也就是说更好的体现开放封闭原则. 简单工厂模式: 概念: 简单工厂模式是类的创建模式,又叫做静态工厂方法模式,是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例,涉及到工厂角色.抽象产品角色以及具体产品角色. 结构图: 分析: 一: 简单工厂类是整个模式的关键所在,包含了必要的逻辑判断,根据

PHP简单工厂模式、工厂方法模式和抽象工厂模式比较

PHP工厂模式概念:工厂模式是一种类,它具有为您创建对象的某些方法.您可以使用工厂类创建对象,而不直接使用 new.这样,如果您想要更改所创建的对象类型,只需更改该工厂即可.使用该工厂的所有代码会自动更改. 根据抽象程度不同,PHP工厂模式分为:简单工厂模式.工厂方法模式和抽象工厂模式 简单工厂模式: /******代码在原文还是git上都有osgit地址 https://git.oschina.net/mjw/pattern.git  *******/ /** *简单工厂模式与工厂方法模式比较