抽象工厂:相比工厂方法模式抽象层次更高,这就意味这抽象工厂返回一组类的工厂。与工厂模式类似,此方法会返回一个工厂,而这个工厂会返回多个子类总的一个,简单来说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个。简单说,抽象工厂是一个工厂对象,该对象又会返回工厂中的一个。
- 抽象工厂:声明一个用于完成抽象产品对象创建操作的接口。
- 具体工厂:实现创建具体产品对象的操作。
- 抽象产品:声明一个用于一类产品对象的接口。
- 具体产品:定义由相应的具体过程来创建的产品的对象。
- 客户端:使用由抽象工厂和抽象产品类声明的唯一借口。
抽象工厂模式应用方法:通过一个示例帮助我们理解一下抽象工厂。假设我们需要一辆车各部分的规格。汽车不同的零件包括车轮,后视镜,引擎和车身;不同品牌的汽车(产品类)是奔驰,宝马,通用汽车。
【基类】
package create.abstracfactory; /** * 基类 * Created by admin on 2018/11/26. */ public abstract class Car { public abstract Parts getWheels(); public abstract Parts getMirrors(); public abstract Parts getEngine(); public abstract Parts getBody(); }
【奔驰】
package create.abstracfactory; /** * Created by admin on 2018/11/26. */ public class BenQ extends Car { @Override public Parts getWheels() { return new Parts("BenQ_Wheels"); } @Override public Parts getMirrors() { return new Parts("BenQ_Mirrors"); } @Override public Parts getEngine() { return new Parts("BenQ_Engine"); } @Override public Parts getBody() { return new Parts("BenQ_Body"); } }
【宝马】
package create.abstracfactory; /** * Created by admin on 2018/11/26. */ public class BMW extends Car { @Override public Parts getWheels() { return new Parts("BMW_Wheels"); } @Override public Parts getMirrors() { return new Parts("BMW_Mirrors"); } @Override public Parts getEngine() { return new Parts("BMW_Engine"); } @Override public Parts getBody() { return new Parts("BMW_Body"); } }
【通用车】
package create.abstracfactory; /** * Created by admin on 2018/11/26. */ public class GeneralMotos extends Car { @Override public Parts getWheels() { return new Parts("GeneralMotos_Wheels"); } @Override public Parts getMirrors() { return new Parts("GeneralMotos_Mirrors"); } @Override public Parts getEngine() { return new Parts("GeneralMotos_Engine"); } @Override public Parts getBody() { return new Parts("GeneralMotos_Body"); } }
【Parts类】
package create.abstracfactory; /** * Parts的规格会因为不同品牌的汽车而不同 * Created by admin on 2018/11/26. */ public class Parts { public String specification; public Parts(String spec){ specification = spec; } public String getSpecification(){ return specification; } }
【测试类】
package create.abstracfactory; /** * Created by admin on 2018/11/26. */ public class CarType { private Car car; public Car getCar(String carType){ if ("BenQ".equals(carType)) { car = new BenQ(); } else if ("BMW".equals(carType)) { car = new BMW(); } else if ("GeneralMotors".equals(carType)) { car = new GeneralMotos(); } return car; } public static void main(String[] args) { CarType carType = new CarType(); Car car = carType.getCar("BenQ"); System.out.println("Wheels: "+car.getWheels().getSpecification()); System.out.println("Mirrors: "+car.getMirrors().getSpecification()); System.out.println("Engine: "+car.getEngine().getSpecification()); System.out.println("Body: "+car.getBody().getSpecification()); } }
抽象工厂模式应用场景
抽象工厂模式的主要优点之一就是屏蔽具体类的创建类的方法,实际应用的类名称不需要再让客户端知道,由于具体类是屏蔽的,因此我们可以在不同的工厂之间切换。