Head-First-Design-Patterns-master\src\headfirst\designpatterns\factory
案例:新建披萨类
将变化的地方进行封装。
简单工厂不是一个“真正的”模式,更像是一种编程习惯。
在设计模式中,所谓“实现一个接口”,并不一定表示“写一个类”,并利用implement关键词来实现某个java接口,“实现一个接口”泛指“实现某个超类型(可以是类或接口)的某个方法”
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
工厂方法模式定义:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
依赖倒置原则:要依赖抽象,不要依赖具体类
定义抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
抽象工厂定义了一个接口,所有的具体工厂都必须实现此接口,这个接口包含一组方法用来生产产品。
具体工厂实现不同的产品家族。要创建一个产品,客户只需要使用其中的一个工厂而完全不需要实例化任何产品对象。
客户的代码中只需要涉及抽象工厂,运行时将自动使用实际的工厂。
定义的Pizza抽象类,具体的pizza种类继承pizza抽象类并具体实现抽象方法prepare方法,继承来Pizza抽象类中的具体方法。
定义的PizzaStore抽象类,具体的pizzaStore种类继承抽象类并具体实现抽象方法createPizza方法,在createPizza方法中new 独特的pizza(导入pizza原料工厂这个参数)。
定义PizzaIngredientFactory接口,此接口是用来生产原料。各地方的独特风味的披萨工厂实现此接口,为独特pizza(继承了Pizza的具体类)的具体实现类提供原料。
工厂方法和抽象工厂:
区别:
工厂方法使用的是类,使用继承,利用工厂方法创建对象,需要扩展一个类,并覆盖他的工厂方法,工厂方法通过子类来创建对象,客户只需要知道他们所使用的抽象类型就可以了,而由子类来负责决定具体类型,
抽象工厂使用的是对象,使用的是组合,提供一个用来创建一个产品家族的抽象类型,这个类型的子类定义了产品被产生的方法。先实例化这个工厂,传入一些针对抽闲类型所写的代码。把一些相关的产品集合起来。如果加入新产品就必须改变接口 。抽象工厂使用工厂方法实现具体工厂
相同点
抽象工厂和工厂方法都是为了创建对象。
可以参考一下这篇博客:https://www.cnblogs.com/zhangchenliang/p/3700820.html