抽象工厂

Posted 技术改变生活

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了抽象工厂相关的知识,希望对你有一定的参考价值。

github https://github.com/spring2go/core-spring-patterns.git

问题域

  • 相关产品家族
    • 电器设备工厂
    • 电扇Fan
    • 日光灯TubeLight
    • 开关Switch
  • 不同风格产品家族
    • 中国电器设备厂(China)
    • 美国电器设备分厂(US)

定义

  • 提供一个接口,用于制造一族相关或者相互依赖的产品,无需指定具体的实现类。
  • 创建工厂的工厂

关系图

技术分享图片

产品 电扇接口

public interface IFan {
    
    public void swithOn();
    
    public void switchOff();

}

电器 工厂接口

  1. 生产风扇
  2. 生产日光灯

    public interface IElectricalFactory {
    
    IFan createFan();
    
    ITubeLight createTubeLight();
    }

中国工厂和产品实现

// 中国制造的风扇
public class ChineseFan implements IFan {

    public void swithOn() {
        System.out.println("The ChineseFan is swithed on ...");
    }

    public void switchOff() {
        System.out.println("The ChineseFan is swithed off ...");
    }

}

// 中国制造的台灯
public class ChineseTubeLight implements ITubeLight {
    public void swithOn() {
        System.out.println("The ChineseTubeLight is swithed on ...");
    }

    public void switchOff() {
        System.out.println("The ChineseTubeLight is swithed off ...");
    }

    public void tuneLight() {
        System.out.println("The ChineseTubeLight is tuned ...");
        
    }
}

// 中国 电器工厂 实现
public class ChineseElectricalFactory implements IElectricalFactory {

    public IFan createFan() {
        return new ChineseFan();
    }

    public ITubeLight createTubeLight() {
        return new ChineseTubeLight();
    }

}

美国工厂和产品 实现

// 美国制造的风扇
public class USFan implements IFan {

    public void swithOn() {
        System.out.println("The USFan is swithed on ...");
    }

    public void switchOff() {
        System.out.println("The USFan is swithed off ...");
    }

}

// 美国制造的 日光灯
public class USTubeLight implements ITubeLight {
    public void swithOn() {
        System.out.println("The USTubeLight is swithed on ...");
    }

    public void switchOff() {
        System.out.println("The USTubeLight is swithed off ...");
    }

    public void tuneLight() {
        System.out.println("The USTubeLight is tuned ..."); 
    }
}

// 美国 电器工厂的 实现
public class USElectricalFactory  implements IElectricalFactory {

    public IFan createFan() {
        return new USFan();
    }

    public ITubeLight createTubeLight() {
        return new USTubeLight();
    }

}

客户端调用

public class AbstractFactoryMain {

    public static void main(String[] args) {

        // 中国 电器工厂 出来的产品都是中国风格的产品
        IElectricalFactory electricalFactory = new ChineseElectricalFactory();
        IFan fan = electricalFactory.createFan();
        fan.swithOn();
        
        // 美国 电器工厂 出来的产品都是美国风格的产品
        electricalFactory = new USElectricalFactory();
        ITubeLight tubeLight = electricalFactory.createTubeLight();
        tubeLight.swithOn();
        tubeLight.tuneLight();
    }
}

好处

  • 解耦
    • 客户代码和具体产品解耦
    • 产品家族之间解耦
  • 比工厂模式更高层的设计模式
  • 标准化产品构造流程
  • 易于替换产品家族

Spring框架应用

  • FactoryBean 接口基于抽象工厂模式
    • ProxyFactoryBean
    • JndiFactoryBean
    • LocalSessionFactoryBean
    • LocalContainerEntityManagerFactoryBean
  • 构造具有很多依赖的复杂对象
  • 构造逻辑易变且依赖于配置

以上是关于抽象工厂的主要内容,如果未能解决你的问题,请参考以下文章

一. 抽象工厂&工厂方法&简单工厂方法

工厂方法与抽象工厂

设计模式之工厂方法和抽象工厂

C++工厂模式(简单工厂工厂方法抽象工厂)

C++工厂模式(简单工厂工厂方法抽象工厂)

设计模式学习——简单工厂模式工厂模式抽象工厂模式