Java设计模式——创建型模式——抽象工厂模式(Abstract Factory Pattern)
抽象工厂模式算是工厂相关模式的终极形态,如果完全理解了上一章的工厂方法模式,那么抽象工厂模式就很好理解了。它与工厂方法唯一的区别就是工厂的接口里是一系列创造抽象产品的方法,而不再是一个,而相应的,抽象产品也不再是一个了,而是一系列相关的产品。这其实是工厂方法模式的一种扩展。
通常用继承和组合两种方式扩展一个接口或者类,一般我们推荐使用组合扩展一个现有的类或接口,但这并非绝对,如果你扩展的子类或子接口与现有的类或接口明显是“是一个(is a)”的关系,也就是继承的关系,那么使用继承可以获得更多的好处。
定义:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类。
抽象工厂模式的类图:
首先要创建一个接口,这个接口就是指的Creator,而一组相关或者相互依赖的对象,就是指的ProductA和ProductB以及它们具体的实现类,我们返回的接口或者抽象类则是指的ProductA和ProductB接口。
java代码结构:
产品A类:
interface ProductA { void methodA(); }
产品A中的一型号:
class ProductA1 implements ProductA { public void methodA() { System.out.println("产品A系列中1型号产品的方法"); } }
产品A中的二型号:
class ProductA2 implements ProductA { public void methodA() { System.out.println("产品A系列中2型号产品的方法"); } }
产品B类:
interface ProductB { void methodB(); }
产品B类的一型号:
class ProductB1 implements ProductB { public void methodB() { System.out.println("产品B系列中1型号产品的方法"); } }产品B类的二型号:
class ProductB2 implements ProductB { public void methodB() { System.out.println("产品B系列中2型号产品的方法"); } }
工厂类:
public interface Creator { ProductA createProductA(); ProductB createProductB(); }两个具体的工厂实现类:
public class ConcreteCreator1 implements Creator { public ProductA createProductA() { return new ProductA1(); } public ProductB createProductB() { return new ProductB1(); } }
public class ConcreteCreator2 implements Creator { public ProductA createProductA() { return new ProductA2(); } public ProductB createProductB() { return new ProductB2(); } }
实现类:
public class Client { public static void main(String[] args) throws Exception { Creator creator = new ConcreteCreator1(); ProductA productA = creator.createProductA(); ProductB productB = creator.createProductB(); productA.methodA(); productB.methodB(); //切换具体的工厂实现类 creator = new ConcreteCreator2(); productA = creator.createProductA(); productB = creator.createProductB(); productA.methodA(); productB.methodB(); } }
1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。