【Java设计模式 | 创建者模式】 抽象工厂模式
前言创建者模式主要关注是“怎么创建对象”它的主要特点是将对象的创建和使用分离。这样可以降低系统的耦合度使用者不需要关注对象的创建细节。创建者模式分为单例模式Singleton【Java设计模式 | 创建者模式】单例模式-CSDN博客工厂方法模式Factory Method【Java设计模式 | 创建者模式】工厂方法模式-CSDN博客抽象工厂模式Abstract Factory【Java设计模式 | 创建者模式】 抽象工厂模式-CSDN博客建造者模式Builder原型模式Prototype前面所说的工厂方法模式中考虑的是一类产品的生产例如畜牧场只养动物、冰箱厂只造冰箱。这些工厂只生产同种类产品同种类产品又称同级别产品也就是说工厂方法模式只考虑生产同等级的产品但在现实生活中有很多综合类的工厂能生产多等级产品例如家电厂不只造冰箱还造微波炉空调等。本文要介绍的抽象工厂模式就是考虑了多等级的生产产品族将同一个工厂所生产的位于不同等级的一组产品称为一个产品族。如下图下面的六个产品都是一个工厂制造。第一列都是不同的电脑称为同级别产品第二行为一个电脑一个手机显然不是同级别产品但它们是同一个工厂创造出来的我们将它们称为一个产品族。抽象工厂模式概念是一种为访问类提供一个创建一组相关的或相互依赖对象的接口且访问类无需指定所要产品的具体类就能的得到同族的不同等级的产品的模式结构。例如你说你想要华为全家桶抽象工厂就会自动给你生产华为电脑华为手机华为平板这一产品族。结构抽象工厂模式的主要角色如下抽象工厂Abstract Factory提供了创建产品的接口它包含了多个创建产品的方法可以创建多个等级的产品具体工厂ConcreteFactory主要是实现抽象工厂中的多种抽象方法完成了具体产品的创建。抽象产品接口Abstract Product定义了产品的规范描述了产品的主要特性和功能。具体产品ConcreteProduct实现了抽象产品角色所定义的接口由具体工厂来创建。它同具体工厂之间是多对一对应。实现抽象产品接口定义两种抽象产品Button和Checkbox。public interface Button { void render(); } public interface Checkbox { void render(); }具体产品实现创建两套具体产品Windows风格和MacOS风格。// Windows风格产品 public class WindowsButton implements Button { Override public void render() { System.out.println(Render a Windows style button); } } public class WindowsCheckbox implements Checkbox { Override public void render() { System.out.println(Render a Windows style checkbox); } } // MacOS风格产品 public class MacOSButton implements Button { Override public void render() { System.out.println(Render a MacOS style button); } } public class MacOSCheckbox implements Checkbox { Override public void render() { System.out.println(Render a MacOS style checkbox); } }抽象工厂接口定义工厂接口包含创建产品族的方法。public interface GUIFactory { Button createButton(); Checkbox createCheckbox(); }具体工厂实现实现针对不同操作系统的工厂。// Windows工厂 public class WindowsFactory implements GUIFactory { Override public Button createButton() { return new WindowsButton(); } Override public Checkbox createCheckbox() { return new WindowsCheckbox(); } } // MacOS工厂 public class MacOSFactory implements GUIFactory { Override public Button createButton() { return new MacOSButton(); } Override public Checkbox createCheckbox() { return new MacOSCheckbox(); } }测试代码通过抽象工厂创建产品族无需关心具体实现。public class Application { private Button button; private Checkbox checkbox; public Application(GUIFactory factory) { button factory.createButton(); checkbox factory.createCheckbox(); } public void render() { button.render(); checkbox.render(); } } // 使用示例 public class Demo { public static void main(String[] args) { // 创建Windows风格应用 Application winApp new Application(new WindowsFactory()); winApp.render(); // 创建MacOS风格应用 Application macApp new Application(new MacOSFactory()); macApp.render(); } }运行结果示例执行Demo类后输出Render a Windows style button Render a Windows style checkbox Render a MacOS style button Render a MacOS style checkbox优点当一个产品族中的多个对象被设计在一起工作时它能保证客户端始终只使用同一个产品族的对象。例如用MacOS工厂只会生成Mac按钮Mac复选框绝对不会出现「Mac按钮Windows复选框」的混乱界面。缺点当某一个产品族中需要添加一个新的产品时所有相关的工厂类都需要去修改。例如如果要加一个新的产品等级「输入框(input)」就必须修改抽象工厂接口并且MacOS、Windows等所有具体工厂都要新增 createInput() 方法代码改动量大。总结抽象工厂模式对于开闭原则的遵守有一定界限也就是说如果你去添加一个新的产品族不违背但要是在某一个产品族里添加新的产品就违背了。