JAVA设计模式之抽象工厂模式

2023-05-16

从jason0539转载 链接地址http://blog.csdn.net/jason0539

前面已经介绍过 简单工厂模式和工厂方法模式,这里继续介绍第三种工厂模式-抽象工厂模式,还是以汽车的制造为例。
例子背景:
随着客户的要求越来越高,宝马车需要不同配置的空调和发动机等配件。于是这个工厂开始生产空调和发动机,用来组装汽车。这时候工厂有两个系列的产品:空调和发动机。宝马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();
    }  
}

关于抽象工厂模式与工厂方法模式的区别,这里就不说了,感觉多看几遍例子就能理解,还有很多提到的产品族、等级结构等概念,说了反而更难理解。

总结:
无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。
       所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAVA设计模式之抽象工厂模式 的相关文章

随机推荐

  • 句子的逆序

    对于一个字符串 xff0c 请设计一个算法 xff0c 只在字符串的单词间做逆序调整 xff0c 也就是说 xff0c 字符串由一些由空格分隔的部分组成 xff0c 你需要将这些部分逆序 给定一个原字符串A 和他的长度 xff0c 请返回逆
  • 字符串移位

    对于一个字符串 xff0c 请设计一个算法 xff0c 将字符串的长度为len的前缀平移到字符串的最后 给定一个字符串A 和它的长度 xff0c 同时给定len xff0c 请返回平移后的字符串 测试样例 xff1a 34 ABCDE 34
  • 拼接最小字典序

    对于一个给定的字符串数组 xff0c 请找到一种拼接顺序 xff0c 使所有小字符串拼接成的大字符串是所有可能的拼接中字典序最小的 给定一个字符串数组strs xff0c 同时给定它的大小 xff0c 请返回拼接成的串 测试样例 xff1a
  • go语言时间类型和时间戳

    时间类型 获取当地时间 fmt span class token punctuation span span class token function Println span span class token punctuation sp
  • 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?

    不可以 xff0c 静态方法只能访问静态成员 xff0c 因为非静态方法的调用要先创建对象 xff0c 在调用静态方法时可能对象并没有被初始化
  • GC是什么?为什么要有GC?

    GC 是垃圾收集的意思 xff0c 内存处理是编程人员容易出现问题的地方 xff0c 忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃 xff0c Java 提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的 xf
  • 空格替换

    请编写一个方法 xff0c 将字符串中的空格全部替换为 20 假定该字符串有足够的空间存放新增的字符 xff0c 并且知道字符串的真实长度 小于等于1000 xff0c 同时保证字符串由大小写的英文字母组成 给定一个string iniSt
  • 合法括号序列判断

    对于一个字符串 xff0c 请设计一个算法 xff0c 判断其是否为一个合法的括号串 给定一个字符串A 和它的长度n xff0c 请返回一个bool值代表它是否为一个合法的括号串 测试样例 xff1a 34 34 6 返回 xff1a tr
  • 最长无重复字符子串

    对于一个字符串 请设计一个高效算法 xff0c 找到字符串的最长无重复字符的子串长度 给定一个字符串A 及它的长度n xff0c 请返回它的最长无重复字符子串长度 保证A中字符全部为小写英文字符 xff0c 且长度小于等于500 测试样例
  • 列出一些你常见的运行时异常(非检查异常)?

    ArithmeticException xff08 算术异常 xff09 ClassCastException xff08 类转换异常 xff09 IllegalArgumentException xff08 非法参数异常 xff09 In
  • 阐述final、finally、finalize的区别

    final xff1a 修饰符 xff08 关键字 xff09 有三种用法 xff1a 如果一个类被声明为final xff0c 意味着它不能再派生出新的子类 xff0c 即不能被继承 xff0c 因此它和abstract是反义词 将变量声
  • 检查是否为BST

    题目描述 请实现一个函数 xff0c 检查一棵二叉树是否为二叉查找树 给定树的根结点指针TreeNode root xff0c 请返回一个bool xff0c 代表该树是否为二叉查找树 代码如下 xff1a package com mian
  • 线程的sleep()方法和yield()方法有什么区别?

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 sleep 方法给其他线程运行机会时不考虑线程的优先级 xff0c 因此会给低优先级的线程以运行的机会 xff1b yield 方
  • 可查询最值的栈

    定义栈的数据结构 xff0c 请在该类型中实现一个能够得到栈最小元素的min函数 代码如下 xff1a 定义两个栈 xff0c 一个stackData xff0c 一个stackMin 将数组中的元素一个个压入stackData栈的时候 x
  • 归并排序(详解)

    时间复杂度 xff1a O xff08 n logn xff09 空间复杂度 xff1a O xff08 n xff09 归并排序分为拆分和归并两个过程 拆分 xff1a 拆分是一个递归的过程 xff0c 实质是将待排序数组均分再均分 xf
  • 双栈队列

    编写一个类 只能用两个栈结构实现队列 支持队列的基本操作 push xff0c pop 给定一个操作序列ope 及它的长度n xff0c 其中元素为正数代表push操作 xff0c 为0代表pop操作 xff0c 保证操作序列合法且一定含p
  • 在进行数据库编程时,连接池有什么作用?

    由于创建连接和释放连接都有很大的开销 xff08 尤其是数据库服务器不在本地时 xff0c 每次建立连接都需要进行TCP 的三次握手 xff0c 释放连接需要进行TCP四次握手 xff0c 造成的开销是不可忽视的 xff09 为了提升系统访
  • Java 虚拟机 gc算法总结

    一 垃圾收集基本的算法 1 引用计数 Reference Counting 为每一个对象添加一个计数器 xff0c 计数器记录了对该对象的活跃引用的数量 如果计数器为0 xff0c 则说明这个对象没有被任何变量所引用 xff0c 即应该进行
  • JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)

    从jason0539转载 链接地址http blog csdn net jason0539 在面向对象编程中 最通常的方法是一个new操作符产生一个对象实例 new操作符就是用来构造对象实例的 但是在一些情况下 new操作符直接生成对象会带
  • JAVA设计模式之抽象工厂模式

    从jason0539转载 链接地址http blog csdn net jason0539 前面已经介绍过 简单工厂模式和工厂方法模式 xff0c 这里继续介绍第三种工厂模式 xff0d 抽象工厂模式 xff0c 还是以汽车的制造为例 例子