前言
上篇博客介绍了简单工厂模式和工厂方法模式,这次介绍抽象工厂模式,抽象工厂模式和工厂方法模式的区别在于需要创建对象的复杂程度上。
抽象工厂模式
抽象工厂模式是围绕着一个超级工厂创建其他工厂。这个超级工厂被称为其他工厂的工厂,主要是为了解决接口选择问题。
举例说明:
还是继续上篇用户使用手的例子,现在生产手机的工厂发现,不同的手机使用的配件也不相同,需要单独的生产配件。例如iphonX使用的原深感摄像头,以及OLED显示屏,而iphone8使用的全新感光元件组成的摄像头,以及视网膜高清显示屏。这样就需要通过每个配件的配件工厂来提供相应的配件。为了在写代码实例时取名称简单,暂且定义iphoneX使用的是A摄像头和A显示器,而iphone8使用的是B摄像头和B感应器。
代码实例如下:
显示器
/** * 显示屏接口 */ public interface Display { }
* iphoneX显示器 class ADisplay implements Display { public ADisplay(){ System.out.println("##### 制造OLED显示屏 #####"); } }
* iphone8显示器 class BDisplay BDisplay(){ System.out.println("##### 制造高清视网膜显示器 #####"); } }
摄像头
* 摄像头接口 Camera { }
* iphoneX摄像头 class ACamera Camera { ACamera(){ System.out.println("##### 制造原深感摄像头 #####" * iphone8摄像头 class BCamera Camera{ BCamera(){ System.out.println("##### 制造搭配全新感光组件的摄像头 #####"); } }
工厂类
* 抽象工厂类 abstract class AbstractFactory { * 获得显示屏 * @return */ abstract Display getDisplay(); * 获得摄像头 * Camera getCamera(); }
* iphoneX配件工厂类 class IphoneXPartsFactory extends AbstractFactory{ * 获得显示屏 * * */ @Override Display getDisplay() { return new ADisplay(); } * 获得摄像头 * * Camera getCamera() { ACamera(); } }
* iphone8配件工厂类 class Iphone8PartsFactory BDisplay(); } BCamera(); } }
用户类
* 用户类 Customer { * 制造配件 * @param af static void madeIphone(AbstractFactory af){ //制造iphone的配件 af.getDisplay(); af.getCamera(); } main(String[] args) { AbstractFactory iphonePartsFactory = IphoneXPartsFactory(); 制造iPhoneX 的配件 madeIphone(iphonePartsFactory); iphonePartsFactory = Iphone8PartsFactory(); 制造iPhone8 的配件 madeIphone(iphonePartsFactory); } }
运行结果:
##### 制造OLED显示屏 #####
##### 制造原深感摄像头 #####
##### 制造高清视网膜显示器 #####
##### 制造搭配全新感光组件的摄像头 #####
工厂模式也是属于创建模式,它是工厂方法模式的进一步推广。在当一个子系统需要一些产品对象,而这些产品又属于一个以上的产品等级结构,那么为了将消费这些产品对象的责任和创建这些产品对象的责任分割开来,这个时候就可以使用抽象工厂模式了。这样在使用产品的一方不要直接参与产品的创建工作,而只需要向一个公用的工厂接口请求所需要的产品。
工厂模式的关系类图如下:
抽象工厂模式中的角色和工厂方法模式中的角色是一样的,这里就不介绍了,可以看上一篇工厂方法模式的角色介绍。
抽象工厂模式的优点和缺点
优点:
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦出来了。
使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从iphoneX的配件到iphone8的配件只需要切换一下具体工厂。
缺点:
抽象工厂模式的缺点是不太容易扩展新的产品。如果需要给整个产品族添加一个新的产品,那么久需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。