抽象工厂模式定义
为创建一组相关或相互依赖的对象家族提供一个接口,而不需要明确指定具体类。
通用类图
具体实现
抽象工厂模式可以理解为在工厂方法模式基础上多了一个维度的约束。原来是有产品A和产品B,现在在每个产品上增加一个条件分类变为产品A1、产品A2和产品B1、产品B2。工厂类变为了生产所有产品的某一类型的工厂,工厂1生产产品A1和B1,工厂2生产产品A2和B2。下面的坐标图提现了产品的变化:
下面就来看看具体的代码实现:
抽象产品类AbstractProductA:
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description: 产品A和产品B之间可以有关系(共同继承某个接口),也可以没有关系。但是要有相同的约束(类型1、2)。
* @Date: Created in 10:03 2018/7/31
* @Modified By:
*/
public abstract class AbstractProductA {
//产品A共有的方法
public void commonMethod() {
System.out.println("this is product A");
}
//不同类型产品B共有方法,不同的实现
public abstract void doSomething();
}
下面是具体的产品ProductA1、ProductA2:
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:14 2018/7/31
* @Modified By:
*/
public class ProductA1 extends AbstractProductA {
public void doSomething() {
System.out.println("this is productA1's implement");
}
}
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:14 2018/7/31
* @Modified By:
*/
public class ProductA2 extends AbstractProductA {
public void doSomething() {
System.out.println("this is productA2's implement");
}
}
同样抽象产品B及其具体产品类与上面相似,在此不再展示,下面会给出完整代码地址。
抽象工厂类AbstractFactory:
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:23 2018/7/31
* @Modified By:
*/
public abstract class AbstractFactory {
public abstract AbstractProductA createProductA();
public abstract AbstractProductB createProductB();
}
下面是具体工厂类ConcreteFactory1、ConcreteFactory2:
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:26 2018/7/31
* @Modified By:
*/
public class ConcreteFactory1 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA1();
}
public AbstractProductB createProductB() {
return new ProductB1();
}
}
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:26 2018/7/31
* @Modified By:
*/
public class ConcreteFactory2 extends AbstractFactory {
public AbstractProductA createProductA() {
return new ProductA2();
}
public AbstractProductB createProductB() {
return new ProductB2();
}
}
最后时客户类Client:
package com.yrs.abstractFactory;
/**
* @Author: yangrusheng
* @Description:
* @Date: Created in 10:27 2018/7/31
* @Modified By:
*/
public class Client {
public static void main(String[] args) {
//声明创建两个类型的工厂对象
AbstractFactory factory1 = new ConcreteFactory1();
AbstractFactory factory2 = new ConcreteFactory2();
//创建A1类型的对象
AbstractProductA a1 = factory1.createProductA();
a1.doSomething();
//创建A2类型的对象
AbstractProductA a2 = factory2.createProductA();
a2.doSomething();
//创建B1类型的对象
AbstractProductB b1 = factory1.createProductB();
b1.doSomething();
//创建B1类型的对象
AbstractProductB b2 = factory2.createProductB();
b2.doSomething();
}
}
通过类图和具体的代码示例相信大家对抽象工厂模式有了整体的认识,对应于的一个应用场景是:一个公司有自己的两款产品A、B,上面图中的1和2就代表安卓和iOS操作系统。
优点
- 封装性,高层模块只需要知道接口或抽象,知道工厂类就可以创建需要的对象。
- 产品族内的约束为非公开状态。
- 横向扩展容易,符合开闭原则。新增一个产品类等级,只需新建一个生产该等级的工厂类即可。
缺点
- 抽象工厂模式的最大缺点就是产品族扩展非常困难,严重违反了开闭原则,新增产品需要修改工厂类接口。
使用场景
一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。
参考
- 《设计模式之禅–第二版》