读后总结:(主要参考P160+P161)
1.依赖倒置原则:P142(抽象化的思想设计,面向接口编程,面向扩展而不是面向修改。)
变量不可以持有具体类的引用;(基类使用new,即持有具体类的引用,使用工厂方法将new具体类部分下放到子类中,即行如。。= new NYPizzaStore();)
不要让类派生自具体类;(如果派生自具体类,就会依赖具体类,请派生自抽象类或接口,即行如pizzaStore nyPizzaStore =)
不要覆盖基类中已实现的方法;(基类中以实现的方法应该尽量适用于所有派生类)
2.工厂方法P160和抽象方法P161的异同:P158(为了实现披萨店从具体种类的披萨中被解耦,即以后不会再修改披萨店抽象基类,只需多个新子类重载createPizza()方法即可)
工厂方法:将具体披萨类的实例化放到了披萨店子类中,披萨店直接使用抽象类型即可。过程如下:
(1)新建披萨店pizzaStore nyPizzaStore = new NYPizzaStore();
(2)下订单nyPizzaStore.orderPizza("chess"); (其中orderPizza已经在基类中实现,orderPizza不知道具体的披萨类型)
(3)制作披萨Pizza pizza = creatPizza("chess");在其中会return new NYStyleChessPizza()
(4)最后的制作流程pizza.prepare();等
抽象工厂:创建一个产品家族抽象类,eg:原料工厂抽象类_包括产品家族如create芝士(),creat火腿(),creat盐()等;而工厂方法仅仅创建一个产品抽象类,eg:披萨店抽象类_包括产品如create披萨();
(1)新建披萨店pizzaStore nyPizzaStore = new NYPizzaStore();
(2)下订单nyPizzaStore.orderPizza("chess"); (其中orderPizza已经在基类中实现,orderPizza不知道具体的披萨类型)
(3)制作披萨Pizza pizza = creatPizza("chess");在其中会return new ChessPizza(“nyIngredientFactory”)
(4)最后的制作流程pizza.prepare();等,有了抽象工厂后改写原来的prepare()方法,(正式开始抽象方法的部分:)在其中会芝士dough = ingredientFactory.creatDough();其他原料类似。在具体的原料工厂中如return new TinCrustDough();
后续实现代码后续编辑。。。。。。