java设计模式---抽象工厂模式
来源:互联网 发布:oracle网络 编辑:程序博客网 时间:2024/04/29 06:08
java设计模式—抽象工厂模式
何为抽象工厂
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。抽象工厂模式与工厂方法模式的最大区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则需要面对多个产品等级结构。
注意事项:抽象工厂模式,产品族难扩展,产品等级易扩展。
什么是产品族和产品等级?所谓产品族,是指位于不同产品等级结构中,功能相关联的产品组成的家族。比如AMD的主板、芯片组、CPU组成一个家族,Intel的主板、芯片组、CPU组成一个家族。而这两个家族都来自于三个产品等级:主板、芯片组、CPU。
在原有的工厂模式基础上增加一个超级工厂
分析:
在上篇博客中《java设计模式—工厂模式》示例实现的CPU接口和CPU实现对象,主板接口和主板实现对象,都不需要变化。将创建CPU的简单工厂和创建主板的简单工厂,代码去掉,新加入的抽象工厂类和实现类。
代码实现
1.创建抽象工厂类
public interface AbstractFactory { /** * 创建CPU对象 * @return CPU对象 */ Cpu createCpu(); /** * 创建主板对象 * @return 主板对象 */ Mainboard createMainboard();}
2.实现抽象工厂类
public class IntelFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new IntelCpu(); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new IntelMainboard(); }}
public class AmdFactory implements AbstractFactory { @Override public Cpu createCpu() { // TODO Auto-generated method stub return new AmdCpu(); } @Override public Mainboard createMainboard() { // TODO Auto-generated method stub return new AmdMainboard(); }}
3.创建电脑工程师
电脑工程师类跟前面的实现相比,主要的变化是:从客户端不再传入选择CPU和主板的参数,而是直接传入客户已经选择好的产品对象。这样就避免了单独去选择CPU和主板所带来的兼容性问题,客户要选就是一套,就是一个系列。
public class ComputerEngineer { /** * 定义组装机需要的CPU */ private Cpu cpu = null; /** * 定义组装机需要的主板 */ private Mainboard mainboard = null; public void makeComputer(AbstractFactory af){ cpu=af.createCpu(); mainboard = af.createMainboard(); cpu.calculate(); mainboard.installCPU(); }}
4.客户端调用
public class Client { public static void main(String[]args){ //创建装机工程师对象 ComputerEngineer cf = new ComputerEngineer(); //客户选择并创建需要使用的产品对象 AbstractFactory af = new IntelFactory(); //告诉装机工程师自己选择的产品,让装机工程师组装电脑 cf.makeComputer(af); }}
什么情况下会使用抽象工厂模式
1.一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有形态的工厂模式都是重要的。
2.这个系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
3.同属于同一个产品族的产品是在一起使用的,这一约束必须在系统的设计中体现出来。(比如:Intel主板必须使用Intel CPU、Intel芯片组)
4.系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于实现。
抽象工厂模式的优点
分离接口和实现
客户端使用抽象工厂来创建需要的对象,而客户端根本就不知道具体的实现是谁,客户端只是面向产品的接口编程而已。也就是说,客户端从具体的产品实现中解耦。
使切换产品族变得容易
因为一个具体的工厂实现代表的是一个产品族,比如上面例子的从Intel系列到AMD系列只需要切换一下具体工厂。
抽象工厂模式的缺点
不太容易扩展新的产品
如果需要给整个产品族添加一个新的产品,那么就需要修改抽象工厂,这样就会导致修改所有的工厂实现类。
- java设计模式--抽象工厂
- Java设计模式-抽象工厂
- Java设计模式--抽象工厂
- java设计模式-抽象工厂
- Java设计模式-抽象工厂设计模式
- java设计模式之抽象工厂模式
- JAVA设计模式之抽象工厂模式
- Java设计模式_抽象工厂模式
- Java设计模式之抽象工厂模式
- 设计模式(JAVA)------抽象工厂模式
- java设计模式之抽象工厂模式
- 【Java设计模式】之抽象工厂模式
- java设计模式---抽象工厂模式
- java设计模式---抽象工厂模式
- java设计模式---抽象工厂模式
- JAVA系列-设计模式-抽象工厂模式
- java设计模式 之 抽象工厂模式
- Java--设计模式之抽象工厂模式
- vue-音频组件
- 2017年9月20日22:45:58
- VS2015+OpenCV2.4.9+Qt5.6安装配置
- Windows上Python2和Python3兼容的办法
- Java8集合及Stream操作
- java设计模式---抽象工厂模式
- 4.定义一个可以接收三个数字的函数,函数体内返回三个数字中最大的数字
- Iterator和ListIterator区别
- Java学习5:this关键字
- 【Android API】3.ViewPager的实现原理和源码分析
- Spring Boot整合集成StringRedisTemplate的简单记录
- JDBC连接数据库的开发流程
- 测试输入框常用特殊字符类别
- python django 环境搭建