一、模式概述
从设计模式的类型来说,简单工厂模式是属于创建型模式,又叫静态工厂方法模式,但不属于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).另外,简单工厂模式通常使用静态工厂方法,这使得无法由子类继承,造成工厂角色无法形成基于继承的等级结构。