文章参考来源:http://www.cnblogs.com/zhili/p/SimpleFactory.html
感谢:Learning hard
认知尚浅,如有错误,愿闻其详!
解析简单工厂模式
1、理解:可以理解为负责生产对象的一个类
该原则就是封装改变,既然要封装改变,自然也就要找到改变的代码,然后把改变的代码用类来封装。降低对象之间的耦合度
2、例子
自己做菜吃与去餐馆吃饭 。
- 自己吃饭,需要学习怎么做菜,自己动手做菜等。
- 去餐馆吃只需要点菜,然后交给厨房厨师做就好。
3、例子中看出简单工厂模式的优点
- 1:简单工厂去除了要吃饭的人(调用类)直接创建对象(煮菜)的责任,仅仅是调用方法(享用餐馆的饭菜),实现对责任的分割。
- 2:第一点优点也间接的促进的这个优点,提高了代码的复用性。每个人想吃饭就去餐馆(工厂类),不用自己在去煮。
4、例子中看出简单工厂模式的缺点
- 1:工厂类集中了所有产品的创建逻辑,一旦不能工作,则整个系统受到影响(餐馆关门的就没得饭吃了)。
- 2:系统拓展困难,添加新产品,需要修改工厂逻辑。(工厂方法可以解决)
5、应用场景
- 1:当工厂类负责创建的对象比较少时,可以使用。
- 2:对工厂创建对象逻辑不关心,不在乎复杂性。
6、UML图
![](https://img.haomeiwen.com/i11467412/e5b9e167ede39089.png)
代码
using System;
namespace SimpleFactory
{
class Program
{
/// <summary>
/// 代码解析简单工厂模式
/// </summary>
static void Main(string[] args)
{
Console.WriteLine("自己煮:");
CustomerCook.IWantEatFood();//一个人自己去煮菜吃
Console.WriteLine();
Console.WriteLine("餐馆煮:");
CustomerRestaurant.IWantEatFood();//餐馆点餐
}
#region 自己去煮菜
/// <summary>
/// 自己煮菜
/// </summary>
class CustomerCook
{
/// <summary>
/// 我想要吃的菜品
/// </summary>
public static void IWantEatFood()
{
Food food1 = Cook("炒蛋");//想吃,就自己做
food1.Print();
Food food2 = Cook("炒鸡肉");
food2.Print();
}
/// <summary>
/// 自己按照菜名来煮出对应的菜品
/// </summary>
/// <param name="type">菜名</param>
/// <returns>返回做好的菜</returns>
public static Food Cook(string type)
{
Food food = null;
if (type.Equals("炒蛋"))//根据自己菜名,做出对应的菜式
{
food = new ScrambledEgg();
}
else if (type.Equals("炒鸡肉"))
{
food = new ScrambledChicken();
}
return food;
}
}
#endregion
#region 餐馆点餐(简单工厂模式)
class CustomerRestaurant
{
/// <summary>
/// 我想要吃的菜品
/// </summary>
public static void IWantEatFood()
{
Food food1 = RestaurantFactory.CreateFood("炒蛋");//想吃,就点菜,让厨师做
food1.Print();
Food food2 = RestaurantFactory.CreateFood("炒鸡肉");
food2.Print();
}
}
/// <summary>
/// 餐厅工厂类
/// </summary>
public static class RestaurantFactory
{
public static Food CreateFood(string type)//工厂创建对象方法
{
Food food = null;
if (type.Equals("炒蛋"))
{
food = new ScrambledEgg();
}
else if (type.Equals("炒鸡肉"))
{
food = new ScrambledChicken();
}
return food;
}
}
#endregion
/// <summary>
/// 菜品抽象类
/// </summary>
public abstract class Food
{
public abstract void Print();//抽象菜品方法
}
/// <summary>
/// 实现炒蛋类
/// </summary>
public class ScrambledEgg : Food
{
public override void Print()//重写方法
{
Console.WriteLine("一份炒蛋");
}
}
/// <summary>
/// 实现炒蛋类
/// </summary>
public class ScrambledChicken : Food
{
public override void Print() //重写方法
{
Console.WriteLine("一份炒鸡肉");
}
}
}
}
网友评论