1、概念
简单工厂模式,又叫做静态工厂方法(Static Factory Method)模式,是由一个工厂对象决定创建出哪一种产品类的实例。
2、UML图
简单工厂模式共包括三个组成部分:工厂(Factory),抽象产品(Product),具体产品(ConcreteProduct)。
① 工厂(Factory):工厂是简单工厂模式的核心,提供了对外接口。客户端或其它程序要获取Product对象,都是通过Factory的接口来获取的。
② 抽象产品(Product):抽象产品是(许多)不同产品抽象出来的。Product可以是接口或者抽象类。
③ 具体产品(ConcreteProduct):工厂中返回的产品对象,实际上是通过ConcreteProduct来创建的。
3、应用场景
考虑一个简单的软件应用场景,一个软件系统可以提供多个外观不同的按钮(如圆形按钮、矩形按钮、菱形按钮等),这些按钮都源自同一个基类,不过在继承基类后不同的子类修改了部分属性从而使得它们可以呈现不同的外观,如果我们希望在使用这些按钮时,不需要知道这些具体按钮类的名字,只需要知道表示该按钮类的一个参数,并提供一个调用方便的方法,把该参数传入方法即可返回一个相应的按钮对象,此时,就可以使用简单工厂模式。
① 工厂类负责创建的对象比较少,由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
② 客户端只知道传入工厂类的参数,对于如何创建对象并不关心。
4、实现思路
在我们平常的编程中,当使用“new”关键字创建一个对象时,此时该类就与这个对象形成依赖关系,也就是它们之间的耦合度高,当需求变化时,我们就不得不去修改此类的源码,那么我们怎么去利用面向对象(OO)的方法去解决这一问题呢?——封装改变。找到改变的代码,将其用类来分装。
既然要封装,那就必须有一个产品(Product)抽象类,用来定义需要生产的产品的基本特征。
其次,要使外部能够获取不同的Product对象,就需要一个对外提供的可调用的接口,而提供对外接口的这个类就是工厂(Factory)类,工厂类负责获取不同的Product对象。
有了接口,就需要有接口来创建产品对象,而创建这些不同产品对象的工作就是具体产品(ConcreteProduct)类来完成的。
5、实现代码
以一个场景为例:比如说我们去餐馆吃饭,不同的人点的菜不一样,顾客(相当于调用工厂的客户端)只需要告诉厨师(相当于工厂Factory)需要吃什么菜(相当于产品Product),餐馆就替我们把这些菜做好了(做什么菜的工作就相当于具体产品ContreteProduct)。
顾客点菜:
// 顾客充当客户端,负责调用简单工厂来生产对象
// 即客户点菜,厨师(相当于简单工厂)负责烧菜(生产的对象)
class Customer
{
static void Main(string[] args)
{
// 客户想点一个西红柿炒蛋
Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");
food1.Print();
// 客户想点一个土豆肉丝
Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");
food2.Print();
Console.Read();
}
}
菜抽象类:
// 菜抽象类
public abstract class Food
{
// 输出点了什么菜
public abstract void Print();
}
具体菜产品类:
// 西红柿炒鸡蛋这道菜
public class TomatoScrambledEggs : Food
{
public override void Print()
{
Console.WriteLine("一份西红柿炒蛋!");
}
}
// 土豆肉丝这道菜
public class ShreddedPorkWithPotatoes : Food
{
public override void Print()
{
Console.WriteLine("一份土豆肉丝");
}
}
简单工厂类:
// 简单工厂类, 负责 炒菜
public class FoodSimpleFactory
{
public static Food CreateFood(string type)
{
Food food = null;
if (type.Equals("土豆肉丝"))
{
food= new ShreddedPorkWithPotatoes();
}
else if (type.Equals("西红柿炒蛋"))
{
food= new TomatoScrambledEggs();
}
return food;
}
}
6、主要优点
① 简单工厂模式解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割,有利于整个软件体系结构的优化。
② 简单工厂模式也起到了代码复用的作用。对于一些通用的对象,不同的客户端不需要各自去创建对象,而只需要共用简单工厂的方法就可以了。
7、主要缺点
① 工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响。
② 系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂,对系统的维护和扩展非常不利。
参考资料: