目录
1. 工厂方法模式之所以可以解决简单工厂的模式
是因为它的实现把具体产品的创建推迟到子类中,此时工厂类不再负责所有产品的创建,而只是给出具体工厂必须实现的接口,
这样工厂方法模式就可以允许系统不修改工厂类逻辑的情况下来添加新产品,这样也就克服了简单工厂模式中缺点
2. 使用工厂方法实现的系统,如果系统需要添加新产品时
我们可以利用多态性来完成系统的扩展,对于抽象工厂类和具体工厂中的代码都不需要做任何改动。
例如,我们我们还想点一个“肉末茄子”,此时我们只需要定义一个肉末茄子具体工厂类和肉末茄子类就可以。而不用像简单工厂模式中那样去修改工厂类中的实现
3. 从UML图来看
在工厂方法模式中,工厂类与具体产品类具有平行的等级结构,它们之间是一一对应的。针对UML图的解释如下:
Creator类:充当抽象工厂角色,任何具体工厂都必须继承该抽象类
TomatoScrambledEggsFactory和ShreddedPorkWithPotatoesFactory类:充当具体工厂角色,用来创建具体产品
Food类:充当抽象产品角色,具体产品的抽象类。任何具体产品都应该继承该类
TomatoScrambledEggs和ShreddedPorkWithPotatoes类:充当具体产品角色,实现抽象产品类对定义的抽象方法,由具体工厂类创建,它们之间有一一对应的关系。
工厂方法模式通过面向对象编程中的多态性来将对象的创建延迟到具体工厂中,从而解决了简单工厂模式中存在的问题,也很好地符合了开放封闭原则(即对扩展开发,对修改封闭)
继承:
在C#中,一个类只能有一个父类,C#和Java都不支持多继承。要想使用多继承,那么请您使用接口。
多态:
不同的对象对于同一个操作,做出的响应不同,那么这种情况在面向对象编程中就称为多态。多态的目的就是为了统一调用。可以通过虚方法实现多态
4、实现思路
个人理解(具体产品的创建从抽象工厂类推迟到工厂子类中):
1) Food => TomatoScrambledEggs(西红柿鸡蛋)
-> override Print()
=> ShreddedPorkWithPotatoes(土豆肉丝)
-> override Print()
2)Creator => TomatoScrambledEggsFactory(创建西红柿炒蛋的工厂类)
-> override CreateFoodFactory()
new TomatoScrambledEggs();
=> ShreddedPorkWithPotatoesFactory(创建土豆肉丝的工厂类)
-> override CreateFoodFactory()
new ShreddedPorkWithPotatoes();
3)客户端调用
1)初始化做菜的工厂
Creator tomatoScrambledEggsFactory = new TomatoScrambledEggsFactory();
Creator shreddedPorkWithPotatoesFactory = new ShreddedPorkWithPotatoesFactory();
2)开始做西红柿炒蛋
Food tomatoScrambledEggs = tomatoScrambledEggsFactory.CreateFoodFactory();
tomatoScrambledEggs.Print();
开始做土豆肉丝
Food shreddedPorkWithPotatoes = shreddedPorkWithPotatoesFactory.CreateFoodFactory();
shreddedPorkWithPotatoes.Print();