[design pattern](5) Factory Method
2024-08-29 20:03:42
前言
在前面一章博主介绍了简单工厂模式(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();
}
}
最新文章
- PHP判断sql语句是否执行成功
- 升级到 PHP-7 遇到的坑 及 经验分享
- ssm+redis 如何更简洁的利用自定义注解+AOP实现redis缓存
- HDU 3639 Bone Collector II(01背包第K优解)
- 轻松学习Linux之VI编辑器的使用
- Codeforces 768B Code For 1
- SVN与Git
- 一次生产 CPU 100% 排查优化实践
- pycharm的list中clear的应用
- Laravel项目部署上线(阿里云 Ubuntu 16.04)
- 工程师死绝的世界答案-python3版
- 《Linux就该这么学》第二天课程
- SVG 学习<;一>;基础图形及线段
- Java之Stream流
- 软工实践-Alpha 冲刺 (10/10)
- LinuxShell脚本编程基础2-变量与数值运算、父shell和子shell
- bootstrap正则表达式验证手机 座机 邮箱
- noip2016 普及组
- 【枚举】bzoj1709 [Usaco2007 Oct]Super Paintball超级弹珠
- 001 unique string