一、适用场景以及优缺点
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("一份蛋炒饭"); } }
因此,简单工厂扩展起来相对麻烦些,在写代码时需要根据自己的需要选择设计模式,切勿适得其反。