工厂模式一一简单工厂(factory)
程序员文章站
2022-06-15 14:15:24
...
写在前面
首先要明白简单工厂,并不是23种设计模式的一种,它更应该归类到一种编程习惯之中,不论是抽象工厂,还是工厂方法都是比较成熟而且富有弹性的设计模式了,在这里谈简单工厂是为了引出那两个重磅级的设计模式。
简单工厂的作用
工厂,一听就知道是用来制造东西的,而在程序里工厂是专门用来创建对象的,这点都不例外,说白了简单工厂模式,就是专门建立了一个类负责对象的创建,想要对象就去找工厂要就行了。
下面举个实例分析一下用不用工厂模式的区别
我们现在有个菜单(接口),有三个实现接口的类,分别是面条,米饭和饺子,模拟一位顾客去吃饭。
类图如下
Java源程序如下
菜单类
package simplefactory_06;
public interface Menu {
public void getMeal();
}
面条类
package simplefactory_06;
public class Noodles implements Menu{
public void getMeal() {
System.out.println("面条");
}
}
饺子类
package simplefactory_06;
public class Dumpling implements Menu{
public void getMeal() {
System.out.println("饺子");
}
}
米饭类
package simplefactory_06;
public class Rice implements Menu{
public void getMeal() {
System.out.println("大米");
}
}
客户端
package simplefactory_06;
public class Client {
public static void main(String[] args) {
Menu m=new Noodles();
m.getMeal();
Menu m1=new Rice();
m1.getMeal();
}
}
下面引入简单工厂
类图
java源程序添加工厂类
package simplefactory_06;
public class FoodFactory {
static Menu menu;
public static Menu getFood(String food){//声明静态方法,用于创建所需对象并返回
if(food.equals("rice"))
menu=new Rice();
else if(food.equals("noodles"))
menu=new Noodles();
else
menu=new Dumpling();
return menu;
}
}
把客户端改为
package simplefactory_06;
public class Client {
public static void main(String[] args) {
Menu m=FoodFactory.getFood("");
m.getMeal();
}
}
对比分析
引入简单工厂之后,客户端想要吃什么,就直接找工厂要对象,而不是自己创建对象,实质上也就是对创建对象进行了封装,其实我之前举外观模式的例子,类图和程序都跟这个例子很像,但是要区别也很容易,外观模式包装接口是为了简化接口,简单工厂是为了统一创建对象。
这样设计的优点
-
- 实现了客户端代码与具体实现的解耦
- 使用对象的时候直接获取,而不必了解对象是怎么创建和管理的
- 使职责分工更加明确,便于系统优化
缺点
-
- 由于工厂类集中了所有实例的创建逻辑,违反了高内聚低耦合的原则。
- 如果要添加新的饭就必须对工厂类进行修改,违反了开闭原则。
而创建简单工厂需要有几种角色
工厂类 |
包含了创建具体类的静态方法(FoodFactory) |
抽象产品 |
简单工厂要返回的产品(menu) |
具体产品 |
具体产品(rice noodles ) |
课后想一想
如果我们的菜单要加入蛋炒饭类,需要更改哪些地方,会不会更改原有的类程序。
下篇文章,我会把简单工厂稍作改进,使它变得容易扩展,这也就是大名鼎鼎的工厂方法模式
传送门 : https://blog.csdn.net/zhen921/article/details/82021274
上一篇: 第8章《工厂方法模式》