本人最近一直在酝酿换一种视角来解读设计模式,但因为某些关键点始终无法突破,所以相关的文章也一拖再拖。
最近有幸受到高人指点,所以决定重新温习下已经被放下许久的二十三种设计模式。
1. 概述
作为创建型模式中最简单的一种,简单工厂模式有着入手简单,应用广泛等诸多优点。实在不失为新手入门设计模式的首选。
2. 应用场景
下饭馆吃饭时,作为消费者的我们是绝对没有义务和必要去了解我们将要所点的菜品是如何被烹饪出来的,我们所关心的只是菜品的色香味等。这与简单工厂模式所封装对象的构建过程有着异曲同工之妙。
2.1 简单工厂类
// 厨房,在本例中就是简单工厂
final class Cookroom {
private static final List<Cuisine> cuisineGroup= new ArrayList<Cuisine>(){/**
*
*/
private static final long serialVersionUID = 1L;
{
add(new ZhaOuJia());
add(new QingZhengWuChangYu());
add(new LianOuWeiPaiGu());
add(new ZhaOuJia());
add(new ZhenZhuYuanZi());
}};
static Cuisine getCuisine(final String name){
for (Cuisine cuisine : cuisineGroup) {
if (cuisine.getName().equalsIgnoreCase(name)) {
return cuisine;
}
}
return null;
}
}
2.2 接口
// 菜肴
interface Cuisine {
String getDescriptionLink();
int getPrice();
String getName();
}
2.3 实例
// 莲藕煨排骨
final class LianOuWeiPaiGu implements Cuisine {
@Override
public String getDescriptionLink() {
return "http://www.ttmeishi.com/CaiPu/1e2124ab04053236.htm";
}
@Override
public int getPrice() {
return 50;
}
@Override
public String getName() {
return "莲藕煨排骨";
}
}
// 清蒸武昌鱼
final class QingZhengWuChangYu implements Cuisine {
@Override
public String getDescriptionLink() {
return "http://www.ttmeishi.com/CaiPu/f181e709ccb23ac9.htm";
}
@Override
public int getPrice() {
return 25;
}
@Override
public String getName() {
return "清蒸武昌鱼";
}
}
2.4 测试
final class Tester {
public static void main(String[] args) {
Cuisine cuisine = Cookroom.getCuisine("清蒸武昌鱼");
descriptCuisine(cuisine);
printSeparator();
cuisine = Cookroom.getCuisine("莲藕煨排骨");
descriptCuisine(cuisine);
/* 以上的测试结果
当前菜系名称: [ 清蒸武昌鱼 ]
价格为: [ 25 ]
相关描述性链接为: [ http://www.ttmeishi.com/CaiPu/f181e709ccb23ac9.htm ]
-----------------------------------------
当前菜系名称: [ 莲藕煨排骨 ]
价格为: [ 50 ]
相关描述性链接为: [ http://www.ttmeishi.com/CaiPu/1e2124ab04053236.htm ]
*/
}
3. 相关类图

简单工厂模式
4. 结语
- 知道自己不应该知道什么,这是本人阅读过《SICP》之后总结出来的箴言,而这句话应用到这个模式里简直完美契合。
- 大晚上以厨房为样例来进行设计模式讲解,有种自作孽的感觉。。。。