工厂模式就是用工厂方法代理new对象,具体分为简单工厂、工厂模式和抽象工厂。
简单工厂:
创建接口 编写实现动物实现类 、有着说话方法 鸟和猪都实现了动物接口 实现了 有着各自的说话方式
创建动物工厂实现类 根据传入的参数创建不同的对象 且一般为静态方法 方便后续调用
编写客户端调用
简单工厂的好处是方便 代码编写简单 调用也方便 但是缺点也是显而易见的 如果我们后续相加一个dog类那么工厂类也得修改 违背了开闭原则 即一个类应该对扩展开放 对修改关闭 。解决这个问题可以使用工厂模式。
工厂模式:
接口与实现类都不变 但是工厂模式需要新建一个工厂抽象类 返回值为类对象
、
然后新建实现类 返回对象
这个时候客户端如果想调用的话直接新建工厂类调用工厂实现类方法返回对象在调用对象内的方法
这样如果想后续增加一个pig类 那么直接新建工厂实现类即可 不需要改变原有的代码 也符合开闭原则。
抽象工厂:
抽象工厂是可以理解为一个超级工厂 该工厂为其他工厂的工厂模式 、为了解决产品族之间的问题。工厂模式为了解决产品等级结构的问题。
在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。抽象工厂模式所提供的一系列产品就组成一个产品族;而工厂方法提供的一系列产品称为一个等级结构。我们依然拿生产汽车的例子来说明他们之间的区别。举个栗子。奔驰旗下汽车和宝马旗下汽车都属于一个等级结构。奔驰旗下的拖拉机和宝马旗下的拖拉机都属于一个产品等级结构。奔驰旗下的汽车和拖拉机属于一个产品族。宝马旗下的汽车和拖拉机属于另一个产品族。抽象工厂就是为了解决这个问题。