【学习笔记】抽象工厂模式
来源:互联网 发布:mac饥荒汉化mod 编辑:程序博客网 时间:2024/06/08 07:18
前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
上一篇笔记
http://blog.csdn.net/su749520/article/details/78534261
Pizza的原料工厂
上一篇的Pizza加盟店主要是根据工厂模式建立起来
工厂模式主要是通过在基类定义一个抽象接口
public abstract Pizza createPizzaStore(),子类通过继承实现,完成解耦。
本期的需求是每个加盟店的原料可能存在质量的良莠不齐的情况,故建立原料工厂进行统一管理。
但是不同加盟店由于地区的特性可能存在原料风味,材料不同,所以这里引入了抽象工厂模式
抽象工厂模式
定义Pizza原料接口
定义一个原料工厂接口
/** * 抽象工厂模式 这里区别工厂模式(工厂模式是非接口,给子类继承的) 用法实现抽象工厂模式的接口 */public interface PizzaMaterialFactory { // 面团 public void createMeterialDough(); // 酱 public void createMeterialSauce();}
Pizza原料子类实现该接口
package com.su.abstractfactorymode.material;import com.su.abstractfactorymode.util.Constants;import android.util.Log;public class QuanZhouCheesePizzaMeterial implements PizzaMaterialFactory { @Override public void createMeterialDough() { Log.d(Constants.TAG, QuanZhouCheesePizzaMeterial.class.getSimpleName() + " createMeterialDough "); } @Override public void createMeterialSauce() { Log.d(Constants.TAG, QuanZhouCheesePizzaMeterial.class.getSimpleName() + " createMeterialSauce "); }}
抽象BasePizza 基类与Pizza原料相关的接口
这里与原料相关的接口如下
public abstract void prepare();
package com.su.abstractfactorymode.domain;import com.su.abstractfactorymode.util.Constants;import android.util.Log;/** * 抽象工厂模式 * */public abstract class BasePizza { public String name; public abstract void prepare(); public void bark() { Log.d(Constants.TAG, "2 bark"); } public void cut() { Log.d(Constants.TAG, "3 cut"); } public void box() { Log.d(Constants.TAG, "4 box"); }}
Pizza子类建立与Pizza原料的关联
package com.su.abstractfactorymode.domain;import com.su.abstractfactorymode.material.PizzaMaterialFactory;import com.su.abstractfactorymode.util.Constants;import android.util.Log;public class QuanZhouCheesePizza extends BasePizza { private PizzaMaterialFactory mPizzaMaterialFactory; public QuanZhouCheesePizza(PizzaMaterialFactory mPizzaMaterialFactory) { name = QuanZhouCheesePizza.class.getSimpleName(); this.mPizzaMaterialFactory = mPizzaMaterialFactory; } @Override public void prepare() { Log.d(Constants.TAG, name + " 1 prepare "); mPizzaMaterialFactory.createMeterialDough(); mPizzaMaterialFactory.createMeterialSauce(); }}
结语
上述完成了Pizza的原料解耦的目的,即Pizza的原料工厂可以根据加盟店的特点进行区分化原料供应
调用方法和接口
方法
========================================================================= BasePizzaStore mQuanZhouPizza = new QuanZhouPizzaStore(); mQuanZhouPizza.orderPizza(Constants.TYPE_CHEESE); BasePizzaStore mShenZhenPizza = new ShenZhenPizzaStore(); mShenZhenPizza.orderPizza(Constants.TYPE_CHEESE);=========================================================================public abstract class BasePizzaStore { /** * 工厂模式 * * 使用方法,继承这个BasePizza类,并实现抽象方法 达到总店BasePizzaStore与加盟店(QuanZhouPizzaStore, * ShenZhenPizzaStore)的解耦 */ public abstract BasePizza createPizzaStoreFactory(String type); public void orderPizza(String type) { // 从加盟店里得到对应加盟店的Pizza BasePizza mPizza = createPizzaStoreFactory(type); mPizza.prepare(); mPizza.bark(); mPizza.cut(); mPizza.box(); }}=========================================================================package com.su.abstractfactorymode.store;import com.su.abstractfactorymode.domain.BasePizza;import com.su.abstractfactorymode.domain.QuanZhouCheesePizza;import com.su.abstractfactorymode.domain.QuanZhouMeatPizza;import com.su.abstractfactorymode.material.QuanZhouCheesePizzaMeterial;import com.su.abstractfactorymode.material.QuanZhouMeatPizzaMeterial;import com.su.abstractfactorymode.util.Constants;/** * 泉州加盟店 */public class QuanZhouPizzaStore extends BasePizzaStore { @Override public BasePizza createPizzaStoreFactory(String type) { BasePizza mPizza = null; if (Constants.TYPE_CHEESE.equals(type)) { // 传入 QuanZhouCheesePizzaMeterial 原料 mPizza = new QuanZhouCheesePizza(new QuanZhouCheesePizzaMeterial()); } else if (Constants.TYPE_MEAT.equals(type)) { mPizza = new QuanZhouMeatPizza(new QuanZhouMeatPizzaMeterial()); } return mPizza; }}=========================================================================
运行结果
/** * 11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizza 1 prepare 11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizzaMeterial createMeterialDough 11-18 15:55:00.601: D/suhuazhi(31189): QuanZhouCheesePizzaMeterial createMeterialSauce 11-18 15:55:00.601: D/suhuazhi(31189): 2 bark 11-18 15:55:00.602: D/suhuazhi(31189): 3 cut 11-18 15:55:00.602: D/suhuazhi(31189): 4 box 11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizza 1 prepare 11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizzaMeterial createMeterialDough 11-18 15:55:00.602: D/suhuazhi(31189): ShenZhenCheesePizzaMeterial createMeterialSauce 11-18 15:55:00.602: D/suhuazhi(31189): 2 bark 11-18 15:55:00.602: D/suhuazhi(31189): 3 cut 11-18 15:55:00.602: D/suhuazhi(31189): 4 box */
Demo位置
http://download.csdn.net/download/su749520/10123992
结语
工厂模式:继承基类的抽象方法,加盟店例子
抽象工厂模式:定义一个接口,子类实现,并通过工厂方法完成,原料工厂例子
阅读全文
0 0
- 抽象工厂模式-- 学习笔记
- 【学习笔记】抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- 设计模式学习笔记--抽象工厂模式
- 设计模式学习笔记-抽象工厂模式
- HeadFirst学习笔记2:抽象工厂模式
- 抽象工厂模式——学习笔记
- 设计模式学习笔记(4)抽象工厂
- 学习笔记_抽象工厂模式
- C#设计模式学习笔记-抽象工厂
- java工厂模式和抽象工厂模式学习笔记
- 抽象工厂模式(笔记)
- 抽象工厂模式学习
- 设计模式学习笔记——简单工厂模式、工厂方法模式、抽象工厂模式
- 设计模式-工厂模式 抽象工厂模式 简单工厂模式学习笔记
- 抽象工厂学习笔记
- 简单工厂模式、工厂模式、抽象工厂模式(学习笔记)
- java模式之抽象工厂模式学习笔记整理
- leetcode: 51. N-Queens
- 十二周-JFrame窗口
- lamp环境搭建
- 【AndroidStudio】开模拟器HAXM加速
- zookeeper实现分布式锁
- 【学习笔记】抽象工厂模式
- git记住用户名和密码
- HTTP请求头,相应头详解
- Android 浮动置顶菜单实战
- Tunnel Warfare(线段树区间合并问题)
- leetcode: 52. N-Queens II
- java多线程:3 线程状态
- 【云星数据---Apache Flink实战系列(精品版)】:Apache Flink高级特性与高级应用001-Flink的内存管理001
- 梳理对Java的synchronized的理解