设计模式——简单工厂模式

一、模式概述

     从设计模式的类型来说,简单工厂模式是属于创建型模式,又叫静态工厂方法模式,但不属于23种GOF设计模式之一。简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单使用的模式,可以理解为是不同工厂模式的一个特殊实现。

     我们现在来分析一个生活中的案例。你每天早上都会去食堂吃早餐,当我们买早餐的时候,食堂里早餐的种类很多。当你选择一种早餐的时候(比如说鸡蛋),食堂的工作人员就会把鸡蛋给你。在这里你只对工作人员说了你想要何种类型的早餐,她便会知道拿什么样的早餐给你。如果我们用面向对象的思维来理解的话,工作人员在这里就充当了一个工厂的角色,她负责根据你的需求返回你想要的东西。这一点正是简单工厂模式的意图。

二、模式意图

       简单工厂模式根据提供给他的数据,返回几个可能类中的一个类的实例

三、模式UML图


其中,模式的参与者:

工厂角色:接受客户端的请求,通过请求负责创建相应的产品对象。

抽象产品角色:是工厂模式所创建的父类或是共同拥有的接口。可以是抽象类或接口。

具体产品对象:工厂模式所创建的对象都是这个角色的实例。

四、具体的模式的实现

我们还以去食堂买早餐为例,做一个简单的示例实现

这是UML类图


下边是实现代码:

首先,建立一个抽象的Food父类

    //定义一个Food的抽象父类
    public abstract class Food
    {   
        //字段、属性
        private string name;
        private string price;

        public string Name
        {
            get { return name; }
            set { name = value; }

        }
        public string Price
        {
            get { return price; }
            set { price = value; }
        }      
        //声明一个Buy的方法
        public abstract string Buy();  
    }

定义各种子类

   public class Egg : Food    //鸡蛋类,继承Food类
    {
        public override string Buy()
        {
            return "这是您要的鸡蛋,价格1元。";
        }
    }
    public class Milk:Food    //牛奶类,继承Food类
    {
        public override string Buy()
        {
            return "这是您要的牛奶,价格1元。";
        }
    }
    public class Bun : Food    //包子类,继承Food类
    {
        public override string Buy()
        {
            return "这是您要的包子,价格0.5元。";
        }
    }

实例化食堂这样一个工厂类

    //定义食堂这样一个工厂类
    public class FoodroomFactory
    {
        public static Food createFood(string food)
        {
            Food fod = null;
            switch (food)
            {
                case "Egg":
                    fod = new Egg();
                    break;
                case "Milk":
                    fod = new Milk();
                    break;
                case "Bun":
                    fod = new Bun();
                    break;
            }
            return fod;
        }
    }

最后,是客户端代码部分

        static void Main(string[] args)
        {
            Food fod;
            //鸡蛋
            fod = FoodroomFactory.createFood("Egg");
            fod.Name = "鸡蛋";
            fod.Price = "1元";
            Console.WriteLine(fod.Buy());
           //牛奶
            fod = FoodroomFactory.createFood("Milk");
            fod.Name = "牛奶";
            fod.Price = "1元";
            Console.WriteLine(fod.Buy());  
            //包子
            fod = FoodroomFactory.createFood("Bun");
            fod.Name = "包子";
            fod.Price = "0.5元";
            Console.WriteLine(fod.Buy());  
        }

     这样,一个简单的食堂工厂类实例就完成了。

五、简单工厂模式的优缺点

    1、工厂类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例,客户端可以免除直接创建产品对象的责任,而仅仅"消费"产品。简单工厂模式通过这种做法实现了对责任的分割。

             2、当产品有复杂的多层等级结构时,工厂类只有自己,以不变应万变,就是模式的缺点。因为工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都要受到影响。

    3、系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,有可能造成工厂逻辑过于复杂,违背了"开放--封闭"原则(OCP).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值