简单工厂存在问题:对象统一行为抽象成一个接口(或者抽象类)之后,再根据传入的类型进行创建实例,但这只适用固定行为的场合,当要实现接口的类型处于不定数,则不适合使用简单工厂模式,而应该使用工厂方法
工厂方法适合场合:
子类有统一的操作行为
子类的数量不固定,随时可能有新的功能子类出现
工厂方法优势:
子类之间是并列的,耦合度比较大
创建具体对象方法灵活,可以使用反射或者第三方IOC容器
/// <summary> /// 菜抽象类 /// </summary> public abstract class Food { //输出点了什么菜 public abstract string Print(); } public class TomatoScrambledEggs : Food { public override string Print() { return "西红柿炒鸡蛋"; } } public class ShreddedPorkWithPotatoes : Food { public override string Print() { return "土豆丝炒鸡蛋"; } } /// <summary> /// 抽象工厂类 /// </summary> public abstract class Creator { /// <summary> /// 工厂方法 /// </summary> /// <returns></returns> public abstract Food CreateFoddFactory(); } /// <summary> /// 西红柿炒鸡蛋工厂类 /// </summary> public class TomatoScrambledEggsFactory : Creator { public override Food CreateFoddFactory() { return new TomatoScrambledEggs(); } } /// <summary> /// 土豆丝炒鸡蛋工厂类 /// </summary> public class ShreddedPorkWithPotatoesFactory:Creator { public override Food CreateFoddFactory() { return new ShreddedPorkWithPotatoes(); } }
调用:
public void Get() { // 初始化做菜的两个工厂() Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory(); Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory(); // 开始做西红柿炒蛋 Food tomatoScrambleEggs = tomatoScrambledEggsFactory.CreateFoddFactory(); string dd = tomatoScrambleEggs.Print(); //开始做土豆肉丝 Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoddFactory(); string dd2 = shreddedPorkWithPotatoes.Print(); }
缺点:
工厂方法是为了克服工厂模式的缺点而设计出来的,每个工厂方法每个具体工厂类只完成单个实例的创建,但是现实生活中,一个工厂只创建单个产品的例子太少啦,所以需要抽象工厂模式: