Java 抽象工厂模式

90 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

image.png

介绍

baike:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。此模式是对工厂方法模式的进一步扩展。在工厂方法模式中,一个具体的工厂负责生产一类具体的产品,即一对一的关系,但是,如果需要一个具体的工厂生产多种产品对象,那么就需要用到抽象工厂模式了。

角色

角色说明
Factory抽象工厂类,负责创建具体产品的实例
ConcreteFactory具体工厂类,实现 Factory 父类的接口功能,也可添加自定义的功能
Product抽象产品类,定义产品子类的公共接口
ConcreteProduct具体产品类,实现 Product 父类的接口功能,也可添加自定义的功能

角色示例

类名担任角色说明
FoxconnFactory富士康工厂类,定义工厂子类的公共接口
ShangHaiFoxconnConcreteFactory上海富士康工厂类,实现工厂类的接口功能,也可添加自定义的功能
ShenZhenFoxconnConcreteFactory深圳富士康工厂类,实现工厂类的接口功能,也可添加自定义的功能
PhoneProduct抽象手机类,定义手机子类的公共接口
IPhoneXSConcreteProductIPhoneXS手机类,实现手机类的接口功能,也可添加自定义的功能
PadProduct抽象平板类,定义平板子类的公共接口
IPadAirConcreteProductIPadAir平板类,实现平板类的接口功能,也可添加自定义的功能

UML 类图

image.png

代码

interface Phone {
    public void call();
}

class IPhoneX implements Phone {
    public void call() {
        System.out.println("IPhoneX can call.");
    }
}

class IPhoneXS implements Phone {
    public void call() {
        System.out.println("IPhoneXS can call.");
    }
}

interface Pad {
    public void photograph();
}

class IPadAir2 implements Pad{
    public void photograph() {
        System.out.println("IPadAir2 can photograph.");
    }
}

class IPadAir3 implements Pad{
    public void photograph() {
        System.out.println("IPadAir3 can photograph.");
    }
}

interface Foxconn{
    public Phone createPhone();
    public Pad createPad();
}

class ShangHaiFoxconn implements Foxconn {
    public Phone createPhone() {
       return new IPhoneX();
    }
    public Pad createPad() {
       return new IPadAir2();
    }
}

class ShenZhenFoxconn implements Foxconn {
    public Phone createPhone() {
       return new IPhoneXS();
    }
    public Pad createPad() {
       return new IPadAir3();
    }
}

class FactoryTest {
    public static void main(String[] args) {
       ShenZhenFoxconn shenZhenFoxconn = new ShenZhenFoxconn();
       Phone phone = shenZhenFoxconn.createPhone();
       phone.call();
       Pad pad = shenZhenFoxconn.createPad();
       pad.photograph();
    }
}

创建 FactoryTest.php,代码如上。

执行

$ javac FactoryTest.java 
$ java FactoryTest
IPhoneXS can call.
IPadAir3 can photograph.