上篇博客介绍了简单工厂模式和工厂方法模式,此次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于须要建立对象的复杂程度上。编程
抽象工厂模式是围绕着一个超级工厂建立其余工厂。这个超级工厂被称为其余工厂的工厂,主要是为了解决接口选择问题。iphone
举例说明:ide
仍是继续上篇用户使用手的例子,如今生产手机的工厂发现,不一样的手机使用的配件也不相同,须要单独的生产配件。例如iphonX使用的原深感摄像头,以及OLED显示屏,而iphone8使用的全新感光元件组成的摄像头,以及视网膜高清显示屏。这样就须要经过每一个配件的配件工厂来提供相应的配件。为了在写代码实例时取名称简单,暂且定义iphoneX使用的是A摄像头和A显示器,而iphone8使用的是B摄像头和B感应器。spa
代码实例以下:code
显示器对象
/** * 显示屏接口 */ public interface Display { }
/** * iphoneX显示器 */ public class ADisplay implements Display { public ADisplay(){ System.out.println("##### 制造OLED显示屏 #####"); } }
/** * iphone8显示器 */ public class BDisplay implements Display { public BDisplay(){ System.out.println("##### 制造高清视网膜显示器 #####"); } }
摄像头blog
/** * 摄像头接口 */ public interface Camera { }
/** * iphoneX摄像头 */ public class ACamera implements Camera { public ACamera(){ System.out.println("##### 制造原深感摄像头 #####"); } }
/** * iphone8摄像头 */ public class BCamera implements Camera{ public BCamera(){ System.out.println("##### 制造搭配全新感光组件的摄像头 #####"); } }
工厂类接口
/** * 抽象工厂类 */ public abstract class AbstractFactory { /** * 得到显示屏 * @return */ public abstract Display getDisplay(); /** * 得到摄像头 * @return */ public abstract Camera getCamera(); }
/** * iphoneX配件工厂类 */ public class IphoneXPartsFactory extends AbstractFactory{ /** * 得到显示屏 * * @return */ @Override public Display getDisplay() { return new ADisplay(); } /** * 得到摄像头 * * @return */ @Override public Camera getCamera() { return new ACamera(); } }
/** * iphone8配件工厂类 */ public class Iphone8PartsFactory extends AbstractFactory{ /** * 得到显示屏 * * @return */ @Override public Display getDisplay() { return new BDisplay(); } /** * 得到摄像头 * * @return */ @Override public Camera getCamera() { return new BCamera(); } }
用户类ip
/** * 用户类 */ public class Customer { /** * 制造配件 * @param af */ public static void madeIphone(AbstractFactory af){ //制造iphone的配件 af.getDisplay(); af.getCamera(); } public static void main(String[] args) { AbstractFactory iphonePartsFactory = new IphoneXPartsFactory(); //制造iPhoneX 的配件 madeIphone(iphonePartsFactory); iphonePartsFactory = new Iphone8PartsFactory(); //制造iPhone8 的配件 madeIphone(iphonePartsFactory); } }
运行结果:get
##### 制造OLED显示屏 #####
##### 制造原深感摄像头 #####
##### 制造高清视网膜显示器 #####
##### 制造搭配全新感光组件的摄像头 #####
工厂模式也是属于建立模式,它是工厂方法模式的进一步推广。在当一个子系统须要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和建立这些产品对象的责任分割开来,这个时候就可使用抽象工厂模式了。这样在使用产品的一方不要直接参与产品的建立工做,而只须要向一个公用的工厂接口请求所须要的产品。
工厂模式的关系类图以下:
抽象工厂模式中的角色和工厂方法模式中的角色是同样的,这里就不介绍了,能够看上一篇工厂方法模式的角色介绍。
客户端使用抽象工厂来建立须要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦出来了。
由于一个具体的工厂实现表明的是一个产品族,好比上面例子的从iphoneX的配件到iphone8的配件只须要切换一下具体工厂。
抽象工厂模式的缺点是不太容易扩展新的产品。若是须要给整个产品族添加一个新的产品,那么久须要修改抽象工厂,这样就会致使修改全部的工厂实现类。