码迷,mamicode.com
首页 > 其他好文 > 详细

抽象工厂

时间:2018-06-06 23:55:39      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:cdn   int   模式   session   alt   应用   ref   container   配置   

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
  • 构造具有很多依赖的复杂对象
  • 构造逻辑易变且依赖于配置

抽象工厂

标签:cdn   int   模式   session   alt   应用   ref   container   配置   

原文地址:https://www.cnblogs.com/zhangjianbin/p/9147832.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!