C#设计模式之工厂方法模式
2019-04-20 本文已影响0人
Memoyu
文章参考来源:http://www.cnblogs.com/zhili/p/FactoryMethod.html
感谢:Learning hard
认知尚浅,如有错误,愿闻其详!
解析工厂方法模式
工厂方法的出现解决简单工厂中的难以拓展的问题,解决了其一旦添加新的产品,则需要修改简单工厂方法,进而造成简单工厂的实现逻辑过于复杂。
1、例子
依旧是简单工厂模式中的去餐馆实现问题。
此时,工厂类不再实现具体的创建产品(对象),而是延伸至子类,工厂类只需要给出必须实现的借口。这样只要有新的产品,只需要创建子类继承于工厂类,实现接口即可。
2、例子中看出工厂方法模式的优点
解决了简单工厂模式的缺点,省去简单工厂模式复杂的创建对象逻辑,符合了开放闭合原则(即对扩展开发,对修改封闭)。
4、例子中看出工厂方法模式的缺点
例子中可以看出,工厂的职能比较单一,只能产出菜,如果是我需要冰饮,则无法做到。
3、应用场景
替代简单工厂模式实现复杂的对象工厂创建。
4、UML图
在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。
![](https://img.haomeiwen.com/i11467412/9bb2b4330f9ad155.png)
代码
using System;
namespace FactoryMethodPattern
{
class Program
{
static void Main(string[] args)
{
CustomerRestaurant.IWantEatFood();//客户点菜
}
/// <summary>
/// 某位客户
/// </summary>
class CustomerRestaurant
{
/// <summary>
/// 我想要吃的菜品
/// </summary>
public static void IWantEatFood()
{
RestaurantFactory scrambledEgg = new ScrambledEggFactory();//点的是炒蛋,则初始化炒蛋工厂
Food food1 = scrambledEgg.CreateFood();//工厂创建出炒蛋这道菜
food1.Print();
RestaurantFactory scrambledChicken = new ScrambledchickenFactory ();
Food food2 = scrambledChicken.CreateFood();
food2.Print();
//////////////////////////////////////////
///客户还想吃炒青瓜,点了炒青瓜
RestaurantFactory scrambledCucumber = new ScrambledCucumberFactory();
Food food3 = scrambledCucumber.CreateFood();
food3.Print();
/////////////////////////////////////////
}
}
/// <summary>
/// 餐馆工厂类
/// </summary>
public abstract class RestaurantFactory
{
public abstract Food CreateFood();//餐厅工厂方法
}
/// <summary>
/// 炒蛋工厂类
/// </summary>
public class ScrambledEggFactory : RestaurantFactory
{
public override Food CreateFood()//负责创建炒蛋这道菜
{
return new ScrambledEgg();
}
}
/// <summary>
/// 炒鸡肉工厂类
/// </summary>
public class ScrambledchickenFactory : RestaurantFactory
{
public override Food CreateFood()//负责创建炒鸡肉这道菜
{
return new ScrambledChicken();
}
}
/////////////////////////////////////////////////////
///根据客户的需求,添加炒青瓜
public class ScrambledCucumberFactory:RestaurantFactory
{
public override Food CreateFood()//负责创建炒青瓜这道菜
{
return new ScrambledCucumber();
}
}
////////////////////////////////////////////////////
/// <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("一份炒鸡肉");
}
}
////////////////////////////////////////////////////
///根据客户需求,添加炒青瓜
/// <summary>
/// 实现炒青瓜类
/// </summary>
public class ScrambledCucumber : Food
{
public override void Print()//重写方法
{
Console.WriteLine("一份炒青瓜");
}
}
////////////////////////////////////////////////////
}
}