简单工厂模式:
组成角色
1、工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。
2、抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。
3、具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。
简单工厂模式的出现,使得用户对使用的成品内部而言是透明的,对用户不需要了解成品的内部的具体实现,只需要告诉工厂类需要什么产品,工厂就会帮你做好。这里有个问题,就是用户必须提供一些必要的关键信息。而且如果需要增加新类型的成品,则需要在工厂类角色中增加代码,这里违背了开闭原则。
工厂方法模式:
组成角色
1、抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
2、具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
3、抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
4、具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法解决了简单工厂模式需要修改原工厂角色的代码,引入了抽象工厂角色。如果需要增加新类型的成品,则只需要增加对应的具体工厂的实例就OK了,这使得抽象工厂成为了用户调用的唯一入口。
//抽象工厂 public interface AirplaneFactory { Airplane makeAirplane(); } //抽象产品 public interface Airplane { void assemblePlane(); } //实例工厂 public class AirbusAirplaneFactory implements AirplaneFactory{ @Override public Airplane makeAirplane() { AirBus airBus = new AirBus(); airBus.assemblePlane(); return airBus; } } //实例工厂 public class BoeingAirplaneFactory implements AirplaneFactory{ @Override public Airplane makeAirplane() { Boeing boeing = new Boeing(); boeing.assemblePlane(); return boeing; } } //实例产品 public class AirBus implements Airplane { public AirBus() { System.out.println("开始生产空客飞机"); } @Override public void assemblePlane() { System.out.println("空客飞机已做好"); } } //实例产品 public class Boeing implements Airplane { public Boeing() { System.out.println("开始生产波音飞机"); } @Override public void assemblePlane() { System.out.println("波音飞机已做好"); } } //客户端 public class Client { public static void main(String[] args) { AirplaneFactory airplaneFactory = new AirbusAirplaneFactory(); AirplaneFactory airplaneFactory1 = new BoeingAirplaneFactory(); airplaneFactory.makeAirplane(); airplaneFactory1.makeAirplane(); } }
注意:如果成品的构成涉及多个产品等级的合成,则此时就需要使用抽象工厂模式。
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。一定要注意,这个接口内的方法不是任意堆砌的,而是一系列相关或相互依赖的方法。比如组装电脑例子中的主板和CPU,都是为了组装一台电脑的相关对象。不同的装机方案,代表一种具体的电脑系列。
抽象工厂模式:
组成角色
抽象工厂角色:这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。
具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。在java中它由具体的类来实现。
抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。
具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。
工厂方法模式组装电脑
抽象工厂模式组装
结构图
存在的问题:如果产品族中增加新的等级产品,则需要修改抽象工厂的实现
优点:使得切换产品族变得容易
未完,随着认识的加深,慢慢修改中
参考:
https://www.cnblogs.com/poissonnotes/archive/2010/12/01/1893871.html
https://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html