工厂方法模式的介绍
简单工厂模式中解决了调用类强依赖实现类的情况,但是简单工厂模式存在弊端,如果需要增加新的实现就需要修改工厂实现方法。这不符合开闭原则,对扩展开放对修改屏蔽。对于已经正常运行的功能代码修改会带来不确定性,应该尽量避免修改已有代码而是通过扩展的方式修改原有功能。
工厂方法模式的用途
工厂方法模式的用途与简单工厂模式用途相同,降低功能类和调用类的强依赖关系。
工厂方法模式的思路
修改原有简单工厂代码中的工厂类,新工厂类已抽象类作为返回值,返回不同实现的具体实例
C# 实现代码
/// <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 Customer
{
public static void CreateFood()
{
// 客户想点一个西红柿炒蛋
#region 简单工厂模式
Food food1 = SimpleFactory.CreateFood("西红柿炒蛋");
food1.Print();
// 客户想点一个土豆肉丝
Food food2 = SimpleFactory.CreateFood("土豆肉丝");
food2.Print();
#endregion
#region 工厂方法模式
Creator tomatorFactory = new TomatoScrambledEggsFactory();
tomatorFactory.CreateFoddFactory().Print();
Creator shreddedPorkFactory = new ShreddedPorkWithPotatoesFactory();
shreddedPorkFactory.CreateFoddFactory().Print();
#endregion
Console.Read();
}
}
/// <summary>
/// 简单工厂类
/// </summary>
public class SimpleFactory
{
/// <summary>
/// 根据菜名创建具体的实例
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
public static Food CreateFood(string type)
{
Food food = null;
if (type.Equals("土豆肉丝"))
{
food = new ShreddedPorkWithPotatoes();
}
else if (type.Equals("西红柿炒蛋"))
{
food = new TomatoScrambledEggs();
}
return food;
}
}
/// <summary>
/// 抽象工厂类
/// </summary>
public abstract class Creator
{
// 工厂方法
public abstract Food CreateFoddFactory();
}
/// <summary>
/// 西红柿炒蛋工厂类
/// </summary>
public class TomatoScrambledEggsFactory : Creator
{
/// <summary>
/// 负责创建西红柿炒蛋这道菜
/// </summary>
/// <returns></returns>
public override Food CreateFoddFactory()
{
return new TomatoScrambledEggs();
}
}
/// <summary>
/// 土豆肉丝工厂类
/// </summary>
public class ShreddedPorkWithPotatoesFactory : Creator
{
/// <summary>
/// 负责创建土豆肉丝这道菜
/// </summary>
/// <returns></returns>
public override Food CreateFoddFactory()
{
return new ShreddedPorkWithPotatoes();
}
}
正文完