【资料图】
抽象工厂模式是对简单工厂模式的一个变种,它允许通过一个统一的接口来创建不同的产品实例,而无需指定具体的子类。在这个模式中,我们只关心产品的抽象接口,而将具体的产品实现留给子类去实现。这样,我们可以通过创建不同的工厂对象来创建不同的产品实例,而无需关心它们实际实现的是哪个具体产品。
抽象工厂模式的实现分为以下几个步骤:
定义抽象产品接口:抽象工厂模式的核心是抽象产品接口,它定义了产品的基本结构和行为。定义具体工厂接口:具体工厂接口是实现抽象产品接口的工厂类,它们负责创建具体产品实例。定义工厂:每个具体工厂都是一个特定领域的工厂,它实现了抽象工厂接口,并提供了具体的产品实现。创建产品实例:使用抽象工厂接口,客户端可以创建不同的产品实例,而无需指定具体的子类。优缺点优点
:
缺点
:
以下以智能产品汽车和手机为例,继承关系如下:
定义抽象工厂/** * 智能产品抽象工厂 */public interface SmartProductFactory { ISmartPhone createSmartPhone(); ISmartCar createSmartCar();}
具体工厂/** * @author physicx * @date 2023/5/17 上午11:18 * @desc 华为工厂 * Created with IntelliJ IDEA */public class HuaweiFactory implements SmartProductFactory { @Override public ISmartPhone createSmartPhone() { return new HuaweiSmartPhone(); } @Override public ISmartCar createSmartCar() { return new HuaweiSmartCar(); }}
/** * @author guogq * @date 2023/5/17 上午11:18 * @desc 小米工厂 * Created with IntelliJ IDEA */public class XiaomiFactory implements SmartProductFactory { @Override public ISmartPhone createSmartPhone() { return new XiaomiSmartPhone(); } @Override public ISmartCar createSmartCar() { return new XiaomiSmartCar(); }}
定义抽象产品/** * 智能手机 */public interface ISmartPhone { void printInfo();}
/** * 智能汽车 */public interface ISmartCar { void printInfo();}
具体产品/** * @author physicx * @date 2023/5/17 上午11:19 * @desc 华为智能汽车 * Created with IntelliJ IDEA */public class HuaweiSmartCar implements ISmartCar { @Override public void printInfo() { System.out.println("华为智能汽车"); }}
/** * @author guogq * @date 2023/5/17 上午11:19 * @desc 华为智能手机 * Created with IntelliJ IDEA */public class HuaweiSmartPhone implements ISmartPhone { @Override public void printInfo() { System.out.println("华为智能手机"); }}
/** * @author guogq * @date 2023/5/17 上午11:19 * @desc 小米智能汽车 * Created with IntelliJ IDEA */public class XiaomiSmartCar implements ISmartCar { @Override public void printInfo() { System.out.println("小米智能汽车"); }}
/** * @author guogq * @date 2023/5/17 上午11:19 * @desc 小米智能手机 * Created with IntelliJ IDEA */public class XiaomiSmartPhone implements ISmartPhone { @Override public void printInfo() { System.out.println("小米智能手机"); }}
客户端调用public static void main(String[] args) { HuaweiFactory huaweiFactory = new HuaweiFactory(); huaweiFactory.createSmartPhone().printInfo(); huaweiFactory.createSmartCar().printInfo(); XiaomiFactory xiaomiFactory = new XiaomiFactory(); xiaomiFactory.createSmartPhone().printInfo(); xiaomiFactory.createSmartCar().printInfo(); }
打印如下:
工厂方法模式和抽象工厂模式区别工厂方法模式和抽象工厂模式都是创建型模式,区别如下:
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。工厂方法模式的使用很简单,只要继承成子类,并实现工厂方法的工厂就可以了,而抽象工厂模式需要先实例化它,然后将它传入一些针对抽象类型所写的代码中。工厂方法模式的优点是可以把一群相关的产品集合起来,而抽象工厂模式的优点是可以把一群相关的产品集合起来,并且创建整个产品家族的模式。总之,工厂方法是由子类自行决定实例化那个类,而抽象工厂是自己决定实例化哪个类。至于是组合还是继承还是实现接口都无所谓。根本区别在于是自己实例化还是子类实例化。
补充说明如果产品单一,只有一个产品等级结构适合使用工厂方法模式。如果存在多个产品等级,产品分类多个可以形成产品族合适使用抽象工厂模式。
后续会依次更新 详解java 23种设计模式,欢迎关注、交流、补充相关内容(如下)。
快捷导航 |
---|
设计模式简介总结 |
单例模式详解 |
工厂方法模式 |
抽象工厂模式 |