C#设计模式之简单工厂模式(Factory method pattern)
一、什么是简单工厂模式?
简单工厂模式实质是一个工厂类根据传入的参数(产品类继承自同一个工厂类),动态的创建哪个产品类的是实例。
二、简单工厂模式的结构
工厂角色:简单工厂模式的核心,负责创建所有具体产品类的实例,工厂类可以被外界直接调用,创建所需的产品实例。
抽象产品角色:是指具体产品角色的父类,负责描述所有产品实例所共有的公共借口。(即所有产品的所共有的并形成抽象)。
具体产品角色:继承自抽象产品角色,一般为多个,是简单工厂模式的创建目标实例,工厂类返回的都是该角色的某一个具体的产品。
三、简单工厂模式的应用场景
日常生活中的中,我们上班到了中午,我们需要吃饭,一种是自己带饭,可前天晚上把饭和菜做好,再用碗装着,第二天上班时再带到公司里来,但这过于麻烦,二种是我们去公司食堂里面吃饭,我们只需告诉老板娘我们想吃什么菜就可以了,煮饭和炒菜事情交个食堂就行了,这里的食堂充当工厂角色,菜充当了具体的产品角色。
在以下情况下可以使用简单工厂模式:
- 工厂类负责创建的对象比较少:由于创建的对象较少,不会造成工厂方法中的业务逻辑太过复杂。
- 客户端只知道传入工厂类的参数,对于如何创建对象不关心:客户端既不需要关心创建细节,甚至连类名都不需要记住,只需要知道类型所对应的参数。
四、简单工厂模式的优缺点
优点:
- 工厂类是整个模式的关键,包含一些逻辑判断,并根据传入的参数,决定究竟应该创建哪个具体类的对象。
- 通过工厂类,外界可以从具体创建具体产品对象的尴尬局面摆脱出来,仅只需要负责“消费”对象就可以了。
- 不必管这些对象究竟如何创建及如何组织的,明确了各自的职责和权利,有利于整个软件体系结构的优化。
缺点:
- 工厂类集中了所有的实例的创建逻辑,违反了开闭原则,将全部的创建的逻辑集中到一个工厂类中
- 工厂类所创建的产品实例是实现考虑的,如果需要添加新的产品,需修改工厂类。
五、简单工厂模式的实现
/// <summary> /// 食堂工厂类(工厂角色) /// </summary> public class CanTenFactory { public static Food CreateFood(string foodType) { Food food = null; switch (foodType) { case "Egg": food = new Egg(); break; case "Potatosilk": food = new Potatosilk(); break; } return food; } }
/// <summary> /// 菜抽象类(抽象产品角色) /// </summary> public abstract class Food { public abstract void PrintFood(); }
/// <summary> /// 鸡蛋(具体产品角色) /// </summary> public class Egg : Food { public override void PrintFood() { Console.WriteLine("一份鸡蛋"); } }
/// <summary> /// 土豆丝 (具体的产品角色) /// </summary> public class Potatosilk : Food { public override void PrintFood() { Console.WriteLine("一份土豆丝"); } }
/// <summary> /// 客户端调用 /// </summary> class Program { static void Main(string[] args) { Console.WriteLine("**************您好,您今天吃什么菜呢?**************"); Console.WriteLine("**************麻烦您帮我来一份鸡蛋和土豆丝吧!**************"); Food egg = CanTenFactory.CreateFood("Egg"); egg.PrintFood(); Food potatosilk = CanTenFactory.CreateFood("Potatosilk"); potatosilk.PrintFood(); Console.ReadKey(); } }
结果: