抽象工厂模式(Abstract Factory Pattern)提供了一个接口,用于创建相关或者依赖对象的家族,而不需要指定具体实现类。
抽象工厂模式允许客户使用抽象接口来创建一组相关的产品,客户类和工厂类分开,客户需要任何产品的时候,只需要向工厂请求即可,客户无须修改就可以获得新产品。
抽象工厂模式的静态建模
客户需要产品只要向抽象工厂请求即可,由具体工厂生产具体产品给客户。
说到这先必都糊涂啦,说下区别吧!
工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。 抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个抽象产品类。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式的具体工厂类可以创建多个具体产品类的实例。
实例:
一个抽象工厂类,可以派生出多个具体工厂类:
Factory.java
public interface Factory { public Salary createSalary(); public Insurance createInsurance(); }
HeBeiFactory.java
public class HeBeiFactory implements Factory{ public Salary createSalary(){ return new HeBeiSalary(); } public Insurance createInsurance(){ return new HeBeiInsurance(); } }
JiLinFactory.java
public class JiLinFactory implements Factory{ public Salary createSalary(){ return new JiLinSalary(); } public Insurance createInsurance(){ return new JiLinInsurance(); } }
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。Salary.javapublic interface Salary { void computerSalary(); }
Insurance.javapublic interface Insurance { void computerInsurance(); }
HeBeiSalary.javapublic class HeBeiSalary implements Salary{ public void computerSalary(){ System.out.println("开始计算河北子公司的薪资"); } }JiLinSalary.javapublic class JiLinSalary implements Salary{ public void computerSalary(){ System.out.println("开始计算吉林子公司的薪资"); } }HeBeiInsurance.javapublic class HeBeiInsurance implements Insurance{ public void computerInsurance(){ System.out.println("开始计算河北子公司的社会保险"); } }JiLinInsurance.javapublic class JiLinInsurance implements Insurance{ public void computerInsurance(){ System.out.println("开始计算吉林子公司的社会保险"); } }Client.javapublic class Client { public static void main(String[] args) { Factory factory = new HeBeiFactory(); Salary salary = factory.createSalary(); salary.computerSalary(); Insurance insurance = factory.createInsurance(); insurance.computerInsurance(); factory = new JiLinFactory(); salary = factory.createSalary(); salary.computerSalary(); insurance = factory.createInsurance(); insurance.computerInsurance(); } }
在工厂方法模式中,客户端不再负责对象的创建,而是把这个责任交给了具体的工厂类,客户端只负责对对象的调用,从而明确了各个类的职责。当一系列相互关联的产品被设计到一个工厂类后,客户端的调用将会变得非常简单。