设计模式之工厂方法模式
来源:互联网 发布:xp添加网络共享打印机 编辑:程序博客网 时间:2024/06/04 18:02
工厂方法:定义一个创建对象的接口,但由子类决定实例化的类是哪一个,工厂方法让类把实例化推迟到子类。
先画出UML类图来理解定义:
应用场景:某披萨连锁公司想要拓展业务,使得更多的加盟店能够加入进来,但是他们希望,要保留总公司一些基本制作流程,以便能保持品牌效果,同时还要满足地域差异而带来的口味不同。
分析该场景:
根据总公司的要求,加盟店需要保持总公司的基本创建步骤,同时又可以自己创建符合当地口味的pizza,于是我们这么设计:
代码文件:
Pizza接口:
package com.design.factorymethod;/** * 披萨接口 * @author Administrator * */public interface Pizza {//准备过程的几个步骤方法public void prepare();public void bake();public void cut();public void box();}
芝加哥风味的两种Pizza:
package com.design.factorymethod;/** * 芝加哥calm披萨 * @author Administrator * */public class ChicagoClamPizza implements Pizza{public void prepare() {System.out.println("prepare ChicagoClamPizza");}public void bake() {System.out.println("bake ChicagoClamPizza");}public void cut() {System.out.println("cut ChicagoClamPizza");}public void box() {System.out.println("box ChicagoClamPizza");}}
package com.design.factorymethod;/** * 芝加哥cheese披萨 * @author Administrator * */public class ChicagoCheesePizza implements Pizza{public void prepare() {System.out.println("prepare ChicagoCheesePizza");}public void bake() {System.out.println("bake ChicagoCheesePizza");}public void cut() {System.out.println("cut ChicagoCheesePizza");}public void box() {System.out.println("box ChicagoCheesePizza");}}
Pizza店的抽象,对工厂方法抽象化,而其他所有方法都可以直接在该类实现。
package com.design.factorymethod;/** * 抽象超类(披萨店) * @author Administrator * */public abstract class PizzaStore {/** * 订阅披萨,客户只需关注这个订阅方法,无需关注如何,创建披萨 * @param type * @return */public Pizza orderPizza(String type){Pizza pizza = createPizza(type);pizza.prepare();pizza.bake();pizza.cut();pizza.box();return pizza;}//工厂方法protected abstract Pizza createPizza(String type);}
然后我们便能实现芝加哥分店的类:
package com.design.factorymethod;/** * 芝加哥披萨 * @author Administrator * */public class ChicagoPizzaStore extends PizzaStore {/** * 实现工厂方法 */@Overrideprotected Pizza createPizza(String type) {if(type.equals("ChicagoCheesePizza")){return new ChicagoCheesePizza();}else if(type.equals("ChicagoCheesePizza")){return new ChicagoClamPizza();}return null;}}
我们做下测试:
package com.design.factorymethod;public class FactoryMehodTest {public static void main(String[] args) {ChicagoPizzaStore chicagoPizzaStore = new ChicagoPizzaStore();chicagoPizzaStore.orderPizza("ChicagoCheesePizza");}}
测试结果
这样一来,既可以保留原来总公司的基本制作流程,各地域的分店还能自己灵活的在上面做一个改良,以便满足当地的口味。
欢迎评论交流,有分析不到位之处,欢迎指出。。
0 0
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式 之 工厂方法
- 设计模式 之 工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 设计模式之工厂方法
- 《设计模式》之工厂方法
- 设计模式之--工厂方法
- 第七届蓝桥杯个人赛省赛(Java B组)第九题
- 【数据压缩】实验二 BMP2YUV
- C#环境即第一个程序
- 深度学习小白——卷积神经网络
- 树莓派入门使用[笔记]
- 设计模式之工厂方法模式
- Win32 多线程学习总结
- HTTP中请求与转发的细节
- TPLINK笔试面试心得
- Git入门笔记(一):Windows下载安装配置git
- cuda 8.0 vs2012平台 编译出现 cuda8.0 error C3861: “__syncthreads”: 找不到标识符
- C++智能指针
- spring aop proxy 静态代理和动态代理
- 时间观念是大学生第一道面试题