设计模式 之 简单工厂与工厂方法

    最近开始学习《大话设计模式》,作者以通俗的方式来讲解,还有故事情节,幽默的对白,给人耳目一新的感觉。非常喜欢作者的这种步步深入,循循善诱的方式。学习了就要总结,总结的时候自己也学着作者的方式,以自己生活中的小例子来实现我们的设计模式。下面就开始我们的第一讲《简单工厂和工厂方法》。

    前两天带着一个老乡去吃饭,当然,作为一个四川人,去外边吃饭当然是点我们著名的川菜!下面先用简单工厂来实现一下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace 简单工厂
{
    //抽象产品类
    public abstract class  food
    {
        public abstract void Show();
    }
    //具体产品类型
    public class huiguorou:food
    {
        public override void Show()
        {
            Console.WriteLine("来咯,回锅肉一份!");
        }
    }
    public class mapodoufu:food
    {
        public override void Show()
        {
            Console.WriteLine("来咯,麻婆豆腐一份!");
        }
    }
    public class shuizhuroupian:food
    {
        public override void Show()
        {
            Console.WriteLine("来咯,水煮肉片一份!");
        }
    }
    public class yuxiangrousi:food
    {
        public override void Show()
        {
            Console.WriteLine("来咯,鱼香肉丝一份!");
        }
    }
    //简单工厂
    public class foodFacoty
    {
        public static food CreateFood(string Name)
        {
            food Food = null;
            switch (Name)
            {
                case "回锅肉":
                    Food = new huiguorou();
                    break;
                case "麻婆豆腐":
                    Food = new mapodoufu();
                    break;
                case "水煮肉片":
                    Food = new shuizhuroupian();
                    break;
                case "鱼香肉丝":
                    Food = new yuxiangrousi();
                    break;
            }
            return Food;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("老板,给我们来份回锅肉!");
            Console.WriteLine("再来一份水煮肉片!");
            food Food1 = foodFacoty.CreateFood("回锅肉");
            Food1.Show();
            food Food2 = foodFacoty.CreateFood("水煮肉片");
            Food2.Show();
        }
    }
}

简单工厂的类图:

简单工厂的优点

1.通过IProduct隔离了客户程序与ConcreteProductA的依赖关系,在客户程序视野内根本就没有ConcreteProductA。

2.即使ConcreteProductA增加、删除方法或属性,也无妨大局,只要按照要求实现了IProduct就可以了,Client无须关心ConcreteProductA的变化。

3.相对直接写个ConcreteProductA而言,要平白地多写一个工厂出来,尤其需要IProduct频繁变化的时候,客户程序也闲不下来。

简单工厂的局限性

简单工厂比较优雅的解决了外部new()的问题,它把目标实例的创建工作交给外部的工厂完成,是设计模式化思想一个很不错的引子。但如果应用中需要工厂的类型只有一个,而且工厂的职责又非常单纯——就是一个new()的替代品,类似我们面向对象中普遍的思路,这时候就需要进一步抽象了,于是出现了新的发展:工厂方法模式和抽象工厂模式。

接下来我们就用工厂方法来改进一下上面的代码,利用工厂方法,我们就不需要上面的简单工厂类,而是创建一个抽象工厂,这个抽象工厂有一个生产食物的方法。然后再用具体的工厂继承抽象工厂,并实现产生不同食物的方法。最后我们的客户端代码也就不一样了。

//抽象工厂
    public abstract class FoodFactory
    {
        public abstract food CreateFood();
    }
    //具体工厂
    public class huiguorouFactory : FoodFactory
    {
        public override food CreateFood()
        {
            return new huiguorou();
        }
    }
    public class mapodoufuFactory : FoodFactory
    {
        public override food CreateFood()
        {
            return new mapodoufu();
        }
    }
    public class shuizhuroupianFactory : FoodFactory
    {
        public override food CreateFood()
        {
            return new shuizhuroupian();
        }
    }
    public class yuxiangrousiFactory : FoodFactory
    {
        public override food CreateFood()
        {
            return new yuxiangrousi();
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("老板,给我们来份回锅肉!");
            Console.WriteLine("再来一份鱼香肉丝");
            FoodFactory factory1 = new huiguorouFactory();
            food Food1 = factory1.CreateFood();
            Food1.Show();
            FoodFactory factory2 = new yuxiangrousiFactory();
            food Food2 = factory2.CreateFood();
            Food2.Show();

        }
    }

工厂方法的类图:

下面我们再来看看使用工厂方法模式的场合:

1.当子类型可能会有很多,以后需要不但增添不同的子类实现时;

2.当一个系统尚在框架设计阶段,还不知道将来需要实例化哪些具体类时;

    3.系统设计之初不需要具体对象的概念(或者说没有具体对象的概念);

    简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。但问题也就在这里,如果要求加另外一个产品,我们就需要在简单工厂类的方法里加‘Case’的分支条件,修改原有的类。这就违背了开放-封闭原则。工厂方法模式是将工厂类抽象出一个接口(或一个抽象类)。然后所有要生产具体类的工厂,去实现这个接口(或继承这个抽象类)。这样,一个简单工厂模式的工厂类,变成了一个工厂抽象接口(或抽象类)和多个具体生成对象的工厂。

    工厂方法模式克服了简单工厂违背开放-封闭原则的缺点,它们都是几种封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低客户程序与产品对象的耦合。

设计模式 之 简单工厂与工厂方法,布布扣,bubuko.com

时间: 2024-08-03 15:32:56

设计模式 之 简单工厂与工厂方法的相关文章

JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 "过程",不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实

【转】设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

(转)设计模式(五)简单工厂模式+工厂方法模式

在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的.但是在一些情况下, new操作符直接生成对象会带来一些问题.举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象. 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部大机器中的一个齿轮传动. 模式的问题:你如何能轻松方便地构造对象实例,而不必关心构造对象实例的细节和

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

重头开始学23种设计模式:三大工厂(简单工厂,工厂方法,抽象工厂)

在开发当中我们经常会使用三个设计模式,来帮我们解决项目代码的可扩展性. 在简单工厂,工厂方法,抽象工厂这三个设计模式当中,代码其实都很简单,主要是要理解运用. 简单工厂: 简单工厂说白了,就是利用Switch根据传递的参数,进行实例化. 工厂方法: 工厂方法,为解决每次都去增加Swicth的简单工厂的升级.为每一个产品提供一个工厂类. 抽象工厂: 抽象工厂,我觉得也是对工厂方法的再次升级,工厂方法每次只能创作一个产品,而抽象工厂就是产品线的产品族. 总结下,从网上找到一个大牛的回复: 我认为不能

大话设计模式之简单工厂模式&工厂方法模式&抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

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

简单工厂.工厂方法和抽象工厂三种设计模式都用来帮助我们将对象的实例化部分抽取出来,优化系统结构,在开发中经常使用.三者既有区别,也有联系,今天来对这三种设计模式做一个简单的记录. 概述 简单工厂:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改工厂) 工厂方法:用来生产同一等级结构中的固定产品(支持增加新的产品) 抽象工厂:用来生产不同产品族的全部产品(支持增加新的产品族,不支持增加新的产品) 简单工厂 一般来说,利用一个静态方法,即将createProduct方法设置为static

设计模式学习之旅——简单工厂、工厂方法、抽象工厂

其实看设计模式已有一段时间了,主要是看<大话设计模式>还有四人帮的<设计模式>,总觉得理解的不够全面,这应该跟项目经验有关系,所谓的理论和实践并重.但又觉得学习本来就是这样,对一个知识有一定了解,以后运用或磕碰时再刷新对这个知识的认知,学学还是有好处的~ 用个故事来描述吧,以下故事为虚实结合而成...... 小白正在为公司开发一款射击类游戏,负责的是选枪的模块:提交的代码如下 static void Main(string[] args) //客户端代码 { Console.Wri

设计模式之 简单工厂,工厂方法,抽象工厂

学习来源: C#设计模式,刘伟 创建型模式描述如何将对象的创建和使用分离,让用户在使用对象时无须关心对象的创建细节,从而降低系统的耦合度,让设计方案更易于修改和扩展. 引言: 简单工厂(静态工厂) 1, 模式适用环境 工厂类负责创建的对象比较少,由于创建的对象较少 ,不会造成工厂方法中的业务逻辑太过复杂 客户端只知道传入工厂类的参数,对于如何创建对象 并不关心 2, 简单工厂(静态工厂)方法的缺点: 工厂类集中了所有产品的创建逻辑,职责过重,一旦 不能正常工作,整个系统都要受到影响 增加系统中类