设计模式(八)之抽象工厂模式
文章目录
- 什么是抽象工厂模式
- 例子
- 总结
- 简单工厂、工厂方法、抽象工厂区别
什么是抽象工厂模式
不关心零件的具体实现,只关心接口,仅使用该接口将零件组装成为产品。
例子
不同厂商生产多个产品
AbstractFactory 生产冰箱空调电视机
package CreationPattern.AbstractFactoryMode;/*** 抽象工厂*/public interface AbstractFactory {Refrigerator createRefrigerator ();AirConditioning createAirConditioning ();TV createTV();
}
Refrigerator
package CreationPattern.AbstractFactoryMode;/*** 冰箱*/public class Refrigerator {public Refrigerator(String s) {System.out.println("create " + s + " refrigerator");}
}
AirConditioning
package CreationPattern.AbstractFactoryMode;/*** 空调*/public class AirConditioning {public AirConditioning(String s) {System.out.println("create " + s + " airConditioning");}
}
TV
package CreationPattern.AbstractFactoryMode;/*** 电视机*/public class TV {public TV(String s) {System.out.println("create " + s + " tv");}
}
HaierFactory
package CreationPattern.AbstractFactoryMode;/*** 海尔品牌工厂*/public class HaierFactory implements AbstractFactory{String brand = "Haier";@Overridepublic Refrigerator createRefrigerator() {return new Refrigerator(brand);}@Overridepublic AirConditioning createAirConditioning() {return new AirConditioning(brand);}@Overridepublic TV createTV() {return new TV(brand);}
}
GeliFactory
package CreationPattern.AbstractFactoryMode;/*** 格力品牌工厂*/public class GeliFactory implements AbstractFactory{private String brand = "Geli";@Overridepublic Refrigerator createRefrigerator() {return new Refrigerator(brand);}@Overridepublic AirConditioning createAirConditioning() {return new AirConditioning(brand);}@Overridepublic TV createTV() {return new TV(brand);}
}
Main
package CreationPattern.AbstractFactoryMode;/*** Main*/public class Main {public static void main(String[] args) {AbstractFactory haierFactory = new HaierFactory();haierFactory.createRefrigerator();haierFactory.createAirConditioning();haierFactory.createTV();AbstractFactory geliFactory = new GeliFactory();geliFactory.createRefrigerator();geliFactory.createAirConditioning();geliFactory.createTV();}
}
结果
总结
抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。
抽象工厂易于增加具体的工厂,而难以增加新的零件。从上述例子也不难看出,在AbstractFactory类中增加一个产品例如洗衣机,所有的具体工厂都需要增加洗衣机,而增加一个具体的工厂例如海信工厂只需实现AbstractFactory类。
简单工厂、工厂方法、抽象工厂区别
简单工厂:单个产品对应单个厂商,1对1。例如空调工厂只生产格力空调
工厂方法:单个产品对应多个厂商,1对多。例如空调工厂生成格力空调,还生产海尔空调
抽象工厂:多个产品对应多个厂商,多对多。例如工厂不仅生产不同品牌的空调,还生产不同品牌的冰箱。
总之,我的理解是抽象工厂和工厂方法的主要区别在于生产能力的不同。
设计模式(八)之抽象工厂模式相关推荐
- 设计模式C#描述——抽象工厂模式
设计模式C#描述--抽象工厂模式 阅读此文应先阅读简单工厂模式与工厂方法模式 抽象工厂模式是对象的创建模式,它是工厂方法模式的进一步推广. 假设一个子系统需要一些产品对象,而这些产品又属于一个以上的产 ...
- 设计模式二、抽象工厂模式
设计模式part2 1. 抽象工厂模式 工厂方法模式有一个问题就是,类的创建依赖工厂类,也就是说,如果想要拓展程序,必须对工厂类进行修改,这违背了闭包原则,所以,从设计角度考虑,有一定的问题, ...
- JavaScript 23 种设计模式之 4 抽象工厂模式
JavaScript 23 种设计模式之 4 抽象工厂模式 概念与特点 结构与实现 应用场景 应用实例 总结 概念与特点 概念: 提供一组相关或相互依赖对象的接口.抽象工厂模式是工厂方法模式的升级版, ...
- 设计模式普及之抽象工厂模式
本文是读<Android源码设计模式解析与实战>后笔记 抽象工厂的定义 为创建一组相关或者是相互依赖的对象提供一个借口,而不需要指定它们的具体类. 抽象工厂的使用场景 一个对象族有相同的约 ...
- 【设计模式】之抽象工厂模式
创造性设计模式 创造型模式主要是为了实例化类所用.进一步又分为类创建.对象创建模式. 类创建模式 类创建模式主要基于继承方式进行实例化 对象创建模式 对象创建模式主要基于委托机制进行实例化 Abstr ...
- java抽象工厂模式实例_Java设计模式百例 - 抽象工厂模式
抽象工厂模式是在工厂方法模式之上的有一次升级,以便能够处理更加复杂的对象创建场景.因此也是所有形态的工厂模式中最为抽象和最具一般性的一种形态. 有朋友可能会想了,工厂方法模式已经是对简单工厂模式的具体 ...
- java设计模式六(抽象工厂模式)
java设计模式-抽象工厂模式 一.概述 抽象工厂模式是在工厂模式的基础上,加上了一个管理工厂的超级工厂.也就是说,工厂的作用是管理各种有相似功能的类,而超级工厂的作用是管理这些工厂. 二.模式示例: ...
- 【设计模式】之抽象工厂模式详解与应用(三)
开心一刻 [问:"怎么样才能给足男人面子"? 神回复:"露出腿上的淤青啊".] 课程介绍 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工 ...
- 设计模式之笔记--抽象工厂模式(Abstract Factory)
抽象工厂模式(Abstract Factory) 定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 类图 描述 多个抽象产品 ...
- 设计模式之【抽象工厂模式】
抽象工厂模式 (Abstract Factory Pattern) 意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 主要解决:主要解决接口选择的问题. 何时使用:系统的产品 ...
最新文章
- 基于MATLAB的RGB转YCBCR色彩空间转换
- java opengl_java基于OpenGL ES实现渲染实例
- mysql like ilike_MySQLilike 子句
- 笔记-中项案例题-2021年上-范围管理
- Mac全量编译ijkplayer生成Android库
- 卡西欧9860连接电脑数据传输_轻松办公好助手,卡西欧STYLISH计算器体验记
- 【渝粤教育】电大中专品牌管理与推广 (2)作业 题库
- 马化腾回应《腾讯没有梦想》:我的理想不是赚多少钱
- Visual Studio 2012 RC 发布
- regexp用法mysql_MySQL中REGEXP正则表达式使用大全
- 使用Kali Linux Metasploit 复现 word宏
- Linux 磁盘清理
- 【破解软件】知音漫客免费看更多漫画
- 电脑重装系统Win10关闭网速限制的方法
- csgo单板透视距离绘制代码
- 数据是一把双刃剑,IPFS/FIL存储助力发展,合理应用技术中
- Reservior Sampling(蓄水池采样) in Data Streams
- 菜学C++ Day55 OJ题目1151桐桐数
- Python,海龟作图,闪避球小游戏
- 不要用for in 不要用for in 不要用for in 尤其在JavaScript 遍历document时
热门文章
- angular2表单初体验
- 那些年我发现的圈子(2)爱奇艺泡泡
- 一文详解DCMM(数据管理能力成熟度评估模型)贯标评估全流程
- 【koa2】介绍路由
- java标识符可以$开头吗_JAVA标识符
- ipython介绍_IPython的介绍与使用
- 电商运营:2020天猫618超级晚营销怎么玩?最新营销方案献上
- “Unable to install breakpoint due to missing line number attributes,Modify compiler options togenera
- 微前端框架 之 single-spa
- 速度之王 — LZ4压缩算法(一)