zoukankan      html  css  js  c++  java
  • 抽象工厂模式

    例子背景:
    随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马320系列配置A型号空调和A型号发动机,宝马230系列配置B型号空调和B型号发动机。

    概念:
       抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。比如宝马320系列使用空调型号A和发动机型号A,而宝马230系列使用空调型号B和发动机型号B,那么使用抽象工厂模式,在为320系列生产相关配件时,就无需制定配件的型号,它会自动根据车型生产对应的配件型号A。

    针对百度百科上对于抽象工厂模式的简介,结合本例如下:

    当每个抽象产品都有多于一个的具体子类的时候(空调有型号A和B两种,发动机也有型号A和B两种),工厂角色怎么知道实例化哪一个子类呢?比如每个抽象产品角色都有两个具体产品(产品空调有两个具体产品空调A和空调B)。抽象工厂模式提供两个具体工厂角色(宝马320系列工厂和宝马230系列工厂),分别对应于这两个具体产品角色,每一个具体工厂角色只负责某一个产品角色的实例化。每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例。

    抽象工厂模式代码

     产品类: 

    //发动机以及型号 
    public interface Engine { 


    public class EngineA extends Engine{ 
    public EngineA(){ 
    System.out.println("制造-->EngineA"); 


    public class EngineBextends Engine{ 
    public EngineB(){ 
    System.out.println("制造-->EngineB"); 



    //空调以及型号 
    public interface Aircondition { 


    public class AirconditionA extends Aircondition{ 
    public AirconditionA(){ 
    System.out.println("制造-->AirconditionA"); 


    public class AirconditionB extends Aircondition{ 
    public AirconditionB(){ 
    System.out.println("制造-->AirconditionB"); 

    }

    创建工厂类:


    //创建工厂的接口 
    public interface AbstractFactory { 
    //制造发动机
    public Engine createEngine();
    //制造空调 
    public Aircondition createAircondition(); 



    //为宝马320系列生产配件 
    public class FactoryBMW320 implements AbstractFactory{ 

    @Override 
    public Engine createEngine() { 
    return new EngineA(); 

    @Override 
    public Aircondition createAircondition() { 
    return new AirconditionA(); 


    //宝马523系列
    public class FactoryBMW523 implements AbstractFactory { 

    @Override 
    public Engine createEngine() { 
    return new EngineB(); 

    @Override 
    public Aircondition createAircondition() { 
    return new AirconditionB(); 



    }

    客户:


    public class Customer { 
    public static void main(String[] args){ 
    //生产宝马320系列配件
    FactoryBMW320 factoryBMW320 = new FactoryBMW320(); 
    factoryBMW320.createEngine();
    factoryBMW320.createAircondition();

    //生产宝马523系列配件 
    FactoryBMW523 factoryBMW523 = new FactoryBMW523(); 
    factoryBMW320.createEngine();
    factoryBMW320.createAircondition();

    }

  • 相关阅读:
    UVa 1592 Database(巧用map)
    TZOJ 4746 Xiangqi(模拟棋盘数组)
    TZOJ 1545 Hurdles of 110m(01背包dp)
    TZOJ 2754 Watering Hole(最小生成树Kruskal)
    TZOJ 1242 求出前m大的数(预处理)
    TZOJ 5280 搜索引擎(模拟字符串)
    TZOJ 4865 统计单词数(模拟字符串)
    TZOJ 5279 马拉松比赛(广搜)
    [luogu4735]最大异或和
    小奇回地球
  • 原文地址:https://www.cnblogs.com/sallyiszxm/p/10986242.html
Copyright © 2011-2022 走看看