[design pattern](5) Factory Method
前言
在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method)。
思考题
首先,让我们来思考下面的问题:
在上一章的内容中我们提到了,博主开了一家饭店,那么,因为经营有方,博主准备在四川和上海开饭店了,也还是那两个菜,大家都知道上海和四川的口味差距非常的大,上海口味偏甜,那么四川口味偏辣。所以为了迎合当地人的口味,我们需要做不同口味的菜。那么你们会怎么做呢?
这时我们如果在原有的简单工厂上添加不同口味的菜,就会违背‘开放-关闭’原则,那么接下来就让我来隆重介绍工厂方法模式。
工厂方法模式
定义:定义一个创建产品的工厂的接口,将具体的产品的创建推迟到工厂子类中,符合‘开发-关闭’原则。
类图:
上面的类图,设计以下的几个角色:
- 抽象产品:为一类产品定义了统一接口。将具体实现与用户解耦。
- 具体产品:实现了抽象产品定义的接口,不同的产品有不同的实现。
- 抽象工厂:为一类工厂定义了统一接口。
- 具体工厂:实现了抽象工厂定义的方法,用来创建具体的产品。
思考题实现
首先,定义一个抽象产品类:
Food.java:
public interface Food {
void fry();
void putSeasoning();
void eat();
}
然后,实现具体的产品:
ShangHaiKungPaoChicken.java:
public class ShangHaiKungPaoChicken implements Food {
@Override
public void fry() {
System.out.println("上海,炒宫保鸡丁!!!");
} @Override
public void putSeasoning() {
System.out.println("上海,加入宫保鸡丁作料!!!");
} @Override
public void eat() {
System.out.println("上海,吃宫保鸡丁!!!");
}
}
ShanghaiTomatoEgg.java:
public class ShangHaiTomatoEgg implements Food {
@Override
public void fry() {
System.out.println("上海,炒西红柿炒蛋!!!");
} @Override
public void putSeasoning() {
System.out.println("上海,放入西红柿炒蛋作料!!!");
} @Override
public void eat() {
System.out.println("上海,吃西红柿炒蛋!!!");
}
}
SiCHuanKungPaoChicken.java:
public class SiChuanKungPaoChicken implements Food {
@Override
public void fry() {
System.out.println("四川,炒宫保鸡丁!!!");
} @Override
public void putSeasoning() {
System.out.println("四川,加入宫保鸡丁作料!!!");
} @Override
public void eat() {
System.out.println("四川,吃宫保鸡丁!!!");
}
}
SiChuanTomatoEgg.java:
public class SiChuanTomatoEgg implements Food {
@Override
public void fry() {
System.out.println("四川,炒西红柿炒蛋!!!");
} @Override
public void putSeasoning() {
System.out.println("四川,放入西红柿炒蛋作料!!!");
} @Override
public void eat() {
System.out.println("四川,吃西红柿炒蛋!!!");
}
}
再然后,定义一个抽象工厂接口:
AbstractHotal.java:
public abstract class AbstractHotal {
public Food saleFood(String foodName) {
Food food = createFood(foodName); food.putSeasoning();
food.fry();
return food;
} public abstract Food createFood(String foodName);
}
再然后,实现抽象工厂:
ShangHaiHotal.java:
public class ShangHaiHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
switch(foodName) {
case "KungPaoChicken":
return new ShangHaiKungPaoChicken();
case "TomatoEgg":
return new ShangHaiTomatoEgg();
default:
return null;
}
}
}
SiChuanHotal.java:
public class SiChuanHotal extends AbstractHotal {
@Override
public Food createFood(String foodName) {
switch(foodName) {
case "KungPaoChicken":
return new SiChuanKungPaoChicken();
case "TomatoEgg":
return new SiChuanTomatoEgg();
default:
return null;
}
}
}
下面是我的测试类:
Custom.java:
public class Custom {
public static void main(String ...args) {
ShangHaiHotal shangHaiHotal = new ShangHaiHotal();
SiChuanHotal siChuanHotal = new SiChuanHotal(); Food shangHaiKungPaoChicken = shangHaiHotal.saleFood("KungPaoChicken");
Food shangHaiTomatoEgg = shangHaiHotal.saleFood("TomatoEgg");
shangHaiKungPaoChicken.eat();
shangHaiTomatoEgg.eat(); Food siChuanKungPaoChicken = siChuanHotal.saleFood("KungPaoChicken");
Food siChuanTomatoEgg = siChuanHotal.saleFood("TomatoEgg");
siChuanKungPaoChicken.eat();
siChuanTomatoEgg.eat();
}
}
[design pattern](5) Factory Method的更多相关文章
- Design Pattern ->Abstract Factory
Layering & Contract Philosophy With additional indirection Abstract Factory //The example code i ...
- Design Pattern —— Prototype /Template Method/Iterator/Composite/Bridge
Prototype /Template Method/Iterator/Composite/Bridge 为什么把这五种设计模式放一起呢,没什么太高大上的原因,就是因为这五种模式JAVA开发最基本的特 ...
- LN : Eden Polymorphic And OOP Design Pattern Abstract Factory
Appreciation to our TA, +7, who designed this task. Client.cpp #include <iostream> #include &l ...
- 简单工厂设计模式(Simple Factory Design Pattern)
[引言]最近在Youtub上面看到一个讲解.net设计模式的视频,其中作者的一个理解让我印象很深刻:所谓的设计模式其实就是运用面向对象编程的思想来解决平时代码中的紧耦合,低扩展的问题.另外一点比较有见 ...
- Factory Method
Question:Based on the previous article,what could you do if we must add an extra function? For exam ...
- Design Pattern ->Factory Method
Layering & Contract Philosophy With additional indirection Factory Method The example code is as ...
- Design Pattern ——Factory Method&Abstract Factory
今天开始复习设计模式.设计模式相关的资料有很多,概念性的东西就画个图就可以了.把关注点放在例子上,设计模式还是要使用中才有感受. 从Factory Method&Abstract Factor ...
- Java Design Pattern(Factory,Singleton,Prototype,Proxy)
一.Factory 设计模式: the most common pattern,create a new object ,eg. A a=new A();工厂模式的好处:工厂模式可以做到把创建对象单独 ...
- 打造属于你的提供者(Provider = Strategy + Factory Method) 设计模式 - Provider Pattern(提供者模式)
打造属于你的提供者(Provider = Strategy + Factory Method) 1.1.1 摘要 在日常系统设计中,我们也许听说过提供者模式,甚至几乎每天都在使用它,在.NET F ...
随机推荐
- numpy中线性代数用法
numpy中线性代数用法 矩阵乘法 >>> import numpy as np >>> x=np.array([[1,2,3],[4,5,6]]) >> ...
- Python自学笔记之计算机基础
osi七层协议应用层-表示层-会话层-传输层-网络层-数据链路层-物理层 无线网协议 ethernet 物理层:网线,光纤 数据链路层:arp协议 mac地址,广播 在广播域内传播 网络层:ip地址标 ...
- Ubuntu下火狐浏览器播放视频出现解码问题
问题描述 点击视频播放按钮,视频不会出现缓冲条,也没任何提示,视频界面就一直是黑屏的状态.右键该视频界面,选择检查元素,点击控制台,发现如下问题: The video on this page can ...
- element-ui使用el-tabs组件的时候浏览器直接卡死的问题
遇到这个问题的原由是:本身自己项目的elementUI版本是2.0.11较低了,项目有个功能是自定义progress进度条颜色,无奈高版本的才有这个配置,所以就升级了elementUI,升级到了最高版 ...
- git使用以及对应sourceTree
git上面的几条指令 (1)要想把A合并到B分支上,就需要先切换到B分支上,然后在合并A分支,执行指令: git checkout B // 这是切换到B分支上 git merge A // 这是将A ...
- JQuery高级笔记
## 今日内容: 1. JQuery 高级 1. 动画 2. 遍历 3. 事件绑定 4. 案例 5. 插件 ## ...
- git如何忽略特殊文件
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定 ...
- Java的GUI框架如何选择? Swing、SWT、AWT、SwingX、JGoodies、JavaFX、Apache Pivot、BeautyEye框架(美观)?
AWT 是swing的基础,运行良好,但缺少高级组件.如果您打算创建丰富的应用程序,那么AWT可能不是最好的方法.但是对于不需要丰富用户界面的较小gui应用程序来说.这可能非常适合,因为它是一个久经考 ...
- roll out项目中原系统自定义程序不能编辑
1.SE38编辑时报 程序源系统与现阶段系统不一致:Carry out repairs in non-original systems only if urgent 2.SE16N 查看表TADIR, ...
- 日语能力考试N2级核心词汇必备—接续词
日语能力考试N2级核心词汇必备—接续词 顺接 だから 因为......所以......(下文可用命令,意志劝诱等)その結果 其结果(口语,书面语都行,但是比较生硬)したがって 从而,因而(书面语, ...