一、适用场景以及优缺点
1.适用场景:
当工厂类负责创建的对象比较少时可以考虑使用简单工厂模式,
客户如果只知道传入工厂类的参数,对于如何创建对象的逻辑不关心时可以考虑使用简单工厂模式
2.优点:
解决了客户端直接依赖于具体对象的问题,客户端可以消除直接创建对象的责任,而仅仅是消费产品。简单工厂模式实现了对责任的分割。
起到了代码复用的作用,因为之前的实现(自己做饭的情况)中,换了一个人同样要去在自己的类中实现做菜的方法,然后有了简单工厂之后,去餐馆吃饭的所有人都不用那么麻烦了,只需要负责消费就可以了。此时简单工厂的烧菜方法就让所有客户共用了。
3.缺点
工厂类集中了所有产品创建逻辑,一旦不能正常工作,整个系统都会受到影响
系统扩展困难,一旦添加新产品就不得不修改工厂逻辑,这样就会造成工厂逻辑过于复杂。
二、代码
也就是将变化的代码写入到一个类里面,这个类就是简单工厂类,也就是简单工厂的原理。
public ActionResult SimapleFactory(){// 客户想点一个西红柿炒蛋 Food food1 = FoodSimpleFactory.CreateFood("西红柿炒蛋");food1.Print();// 客户想点一个土豆肉丝Food food2 = FoodSimpleFactory.CreateFood("土豆肉丝");food2.Print();return View();}
/// <summary>/// 菜抽象类/// </summary>public abstract class Food{// 输出点了什么菜public abstract void Print();}/// <summary>/// 西红柿炒鸡蛋这道菜/// </summary>public class TomatoScrambledEggs : Food{public override void Print(){Console.WriteLine("一份西红柿炒蛋!");}}/// <summary>/// 土豆肉丝这道菜/// </summary>public class ShreddedPorkWithPotatoes : Food{public override void Print(){Console.WriteLine("一份土豆肉丝");}}/// <summary>/// 简单工厂类, 负责 炒菜/// </summary>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;}}
此时,如果有个客户想要吃蛋炒饭,就需要在简单工厂类中加上蛋炒饭,并且新建一个继承于Food的蛋炒饭(EggAndRice)类
代码如下:
/// <summary>/// 简单工厂类, 负责 炒菜/// </summary>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();}else if (type.Equals("蛋炒饭")){food = new EggAndRice();}return food;}}/// <summary>/// 蛋炒饭这道菜/// </summary>public class EggAndRice : Food{public override void Print(){Console.WriteLine("一份蛋炒饭");}}
因此,简单工厂扩展起来相对麻烦些,在写代码时需要根据自己的需要选择设计模式,切勿适得其反。