设计模式之抽象工厂模式(Abstract Factroy)
来源:互联网 发布:武汉大学张梦婷 知乎 编辑:程序博客网 时间:2024/06/03 02:27
1.解析
定义: 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类.
UML :
适用性:
(1) 一个系统要独立于它的产品的创建、组合和表示时。
(2) 一个系统要由多个产品系列中的一个来配置时。
(3) 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
(4) 当你提供一个产品类库,而只想显示它们的接口而不是实现时。
2.实例
实例说明 :
接着上一篇,新店经过装修后,重新开张! 根据现代人们的健康需求,新店重新进行了规划,划分为了素食区和肉食区. 让人们更注意自己的身体力行,更符合当代人的需求.
图示说明 :
$ 1 . 面类食品
(1) 面类食品实现 (车间1) : 安排制作面类食品
package foods;public abstract class MianFenGuan { /** * 角色: 面食主任 * 任务: 安排制作面食 * 目的: */ public abstract void makeMianFood(); //制作素面 public void makeSuMian(){} //制作肉面 public void makeRouMian(){} //制作肉饺子 public void makeRouJiaoZi(){} //制作素饺子 public void makeSuJiaoZi(){}}
(2) 面类食品 : 素食
package mianfenfoods;import foods.MianFenGuan;public class SuMianDaChu extends MianFenGuan { /** * 角色: 素面大厨 * 任务: 制作素面 * 目的: */ @Override public void makeMianFood() { System.out.println("素面制作中,请稍后............."); } @Override public void makeSuMian() { System.out.println("我是素面大厨,素面制作好了 :)"); } @Override public void makeSuJiaoZi() { System.out.println("我是素面大厨,素饺子制作好了 :)"); }}
(3) 面类食品: 肉食
package mianfenfoods;import foods.MianFenGuan;public class RouMianDaChu extends MianFenGuan { /** * 角色: 肉面大厨 * 任务: 制作有关面食和肉类的食物 * 目的: */ @Override public void makeMianFood() { System.out.println("肉面正在制作中,请稍后................"); } @Override public void makeRouMian() { System.out.println("我是肉面大厨,肉面制作好了:)"); } @Override public void makeRouJiaoZi() { System.out.println("我是肉面大厨,肉饺子制作好了:)"); }}
$ 2. 米类食品
(1) 米类食品(车间1) : 安排制作任务
package foods;public abstract class RiceGuan { /** * 角色: 米饭主任 * 任务: 安排米饭和炒菜的制作 * 目的: */ //必须上的米饭 public abstract void makeRiceFood(); //炒肉 public void chaoRou(){} //炒菜 public void chaoCai(){}}
(2) 米类食品 : 素菜
package ricefoods;import foods.RiceGuan;public class ChaoCaiDaChu extends RiceGuan { /** * 角色: 炒菜大厨 * 任务: 为米饭炒菜 * 目的: */ @Override public void makeRiceFood() { System.out.println("炒菜正在炒中,请稍后..........."); } @Override public void chaoCai() { System.out.println("我是炒菜大厨,菜炒好了:)"); }}
(3) 米类食品 : 肉食
package ricefoods;import foods.RiceGuan;public class ChaoRouDaChu extends RiceGuan { /** * 角色: 炒肉大厨 * 任务: 为米饭炒肉 * 目的: */ @Override public void makeRiceFood() { System.out.println("炒肉正在炒中,请稍后............"); } @Override public void chaoRou() { System.out.println("我是炒肉大厨,肉炒好了:)"); }}
$ 3. 后厨主任登场
(1) 总工厂: 后厨主任 , 安排任务
package factory;import foods.MianFenGuan;import foods.RiceGuan;public abstract class ServiceFactorys { /** * 角色: 后厨主任 * 任务: 管理任务菜 * 目的: */ public abstract MianFenGuan getMianFenFood(); public abstract RiceGuan getRiceFood();}
(2) 子工厂 : 制作 素食 食品
package factorys;import ricefoods.ChaoCaiDaChu;import mianfenfoods.SuMianDaChu;import factory.ServiceFactorys;import foods.MianFenGuan;import foods.RiceGuan;public class SuFactory extends ServiceFactorys { /** * 角色: 素食服务员 * 任务: 专为素食区服务 * */ @Override public MianFenGuan getMianFenFood() { //素面食 return new SuMianDaChu(); } @Override public RiceGuan getRiceFood() { //素米饭 return new ChaoCaiDaChu(); }}
(3) 子工厂 : 制作肉类 食品
package factorys;import ricefoods.ChaoRouDaChu;import mianfenfoods.RouMianDaChu;import factory.ServiceFactorys;import foods.MianFenGuan;import foods.RiceGuan;public class RouFactory extends ServiceFactorys { /** * 角色: 肉类食品服务员 * 任务: 专为肉食区服务 * 目的: */ @Override public MianFenGuan getMianFenFood() { // 肉食,面食区 return new RouMianDaChu(); } @Override public RiceGuan getRiceFood() { // 肉食,米食区 return new ChaoRouDaChu(); }}
$ 4. 大厅经理 测试
(1) 简单工厂: 帮助类实现,实例化子工厂
package factory;public class ShangFanAndCai { private final static String ROU_FACTORY_NAME = "factorys.RouFactory"; private final static String SU_FACTORY_NAME = "factorys.SuFactory"; private final static String ROU_NAME = "rou"; private final static String SU_NAME = "su"; public static ServiceFactorys getServiceFactoryInstence(String type) { try { if (ROU_NAME.equals(type)) { return (ServiceFactorys) Class.forName(ROU_FACTORY_NAME) .newInstance(); } else if (SU_NAME.equals(type)) { return (ServiceFactorys) Class.forName(SU_FACTORY_NAME) .newInstance(); } else { return null; } } catch (Exception e) { System.out.println(e.getMessage()); } return null; }}
(2) 测试类 实现 : 大厅经理
package demo;import factory.ServiceFactorys;import factory.ShangFanAndCai;import foods.MianFenGuan;import foods.RiceGuan;public class AbstractFactroyTest { /** * 新店经过装修后,重新开张! 根据现代人们的健康需求,新店重新进行了规划,划分为了素食区和肉食区. 让人们更注意自己的身体力行,更符合当代人的需求. */ private final static String ROU_NAME = "rou"; private final static String SU_NAME = "su"; /** * 角色 : 大厅经理 目的 : 收银,通知上菜 * * @param args */ public static void main(String[] args) { //拿到 后主主任 : 肉类制作后厨,下面的肯定都是制作肉类食物 ServiceFactorys rouFactory = ShangFanAndCai .getServiceFactoryInstence(ROU_NAME); //后厨主任 通知 面食主任 : 上的肯定是肉类+面食 MianFenGuan mianFenGuan = rouFactory.getMianFenFood(); mianFenGuan.makeMianFood(); mianFenGuan.makeRouJiaoZi(); mianFenGuan.makeRouMian(); //后厨主任 通知 米饭主任 : 上的肯定是肉类+米饭 RiceGuan riceGuan=rouFactory.getRiceFood(); riceGuan.makeRiceFood(); riceGuan.chaoRou(); }}
3.优缺点
优点:
1、抽象工厂模式隔离了具体类的生产,使得客户并不需要知道什么被创建。
2、当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
3、增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点:
增加新的产品等级结构很复杂,需要修改抽象工厂和所有的具体工厂类,对“开闭原则”的支持呈现倾斜性
4.工厂模式总结
相同点:
1、 都是为客户调用程序与具体的对象类型之间提供了一个解耦作用,这里怎么说呢?其实就是应用程序不关心这个对象是怎么出来的,只关系如何使用这个对象,而且以后就算对象发生变化,那么也不需要修改用户应用程序的代码。
2、提高了程序的可维护性和低耦合性
异同点:
1、 简单工厂模式:是简单的一些列没有任何依赖关系的对象的创建,内部包含复杂的逻辑关系,一半是通过配置或者参数来进行创建对象,适合对象类型不多,并且不会经常新增的情况下。
工厂模式:每个工厂负责具体类型对象的创建,提供了可以动态新增产品类型的创建,并不需要修改现有的程序就可以无缝的新增产品类型。
抽象工厂模式:支持动态的新增对象类型和新增工厂类型,实现多种依赖关系的对象或者组合关系的创建,适合现有项目中的对象创建过程。
2、简单工厂模式:内部逻辑复杂,不符合高内聚的原则。
工厂模式:每次新增一个对象类型,就必须新增一个对应的创建工厂,无疑这是一个非常大的工作量。
抽象工厂模式:是在简单工厂模式的基础上经过改进具有前2个模式的优点,又屏蔽了他们的一些缺点。
5.Demo免积分下载
http://download.csdn.net/detail/lablenet/9291255
- 设计模式之抽象工厂模式(Abstract Factroy)
- Java设计模式:抽象工厂模式(Abstract Factroy Pattern)
- 【设计模式】之 Abstract Factory 抽象工厂
- 设计模式之:抽象工厂(Abstract Factory)
- 设计模式之抽象工厂Abstract Factory
- 设计模式之抽象工厂Abstract Factory
- 设计模式之工厂方法模式(Factroy Method)
- 设计模式笔记之工厂模式--抽象工厂(Abstract Factory)
- .Net设计模式之抽象工厂模式(Abstract Factory)
- Net设计模式之抽象工厂模式(Abstract Factory Pattern)
- 设计模式(二)之Abstract Factory - 抽象工厂模式
- 设计模式读书笔记之抽象工厂模式(Abstract Factory)
- 设计模式之二(抽象工厂模式)(Abstract Factory)
- Java设计模式之抽象工厂(Abstract Factory)模式
- 设计模式之(十一、抽象工厂模式Abstract Factory)
- JAVA设计模式之抽象工厂(Abstract Factory)模式
- 设计模式-创建型模式之 Abstract Factory(抽象工厂)
- 设计模式之六 --- 抽象工厂模式(Abstract Factory)
- Android OTA在线升级一(架构分析)
- 流形学习入门篇2
- Zenefits CodeSprint:Knight or Knave
- Android React Native加载图片资源的正确姿势
- android LevelListDrawable
- 设计模式之抽象工厂模式(Abstract Factroy)
- 获取NVIDIA显卡的温度
- 判别式模型与生成式模型
- 配置JDK————找不到或无法加载主类
- NYOJ 814 又见拦截导弹(LIS)
- 关于欧几里得算法和拓展欧几里得算法
- glFlush和glFinish以及SwapBuffer的用法
- java.util.regex 包中自带的两个 正则表达式类的使用总结
- 实体框架(Entity Framework)--简介