定义
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。在简单工厂模式中,可以根据参数的不同返回不同类的实例。
简单工厂模式专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
直接将简单工厂模式的使用情景及代码告诉大家可能会有点蒙蔽,以及为什么要用简单工厂模式,我不用行不行?先来一段代码
public class SingleFactoryDemo {
public static void main(String[] args) {
Food food=new Hamberger();
food.eat();
}
}
interface Food{
void eat();
}
class Hamberger implements Food{
public void eat() {
System.out.println("汉堡包");
}
}
分析上面代码可能存在的问题
- 这样设计时很脆弱的,为什么呢,如果将服务端的Hamberger类名改成Hamberger2,客户端也要进行改动
- 这样服务端和客户端是耦合的
我们希望的效果是无论服务端代码怎么改,客户端代码不用改。
下面上一段简单工厂的代码:
public class SingleFactoryDemo {
public static void main(String[] args) {
Food food=FoodFactory.getFood(1);
food.eat();
}
}
interface Food{
void eat();
}
class Hamberger implements Food{
public void eat() {
System.out.println("汉堡包");
}
}
class FoodNodles implements Food{
public void eat() {
System.out.println("过桥米线");
}
}
class FoodFactory{
private static Food food=null;
public static Food getFood(int n){
switch (n){
case 1:
food=new Hamberger();
break;
case 2:
food=new FoodNodles();
break;
}
return food;
}
}
这就是一个很简单的简单工厂模式的例子,我么来分析一下这种设计的优缺点。
-
简单工厂模式的优点:
-
实现了客户端与服务端的解耦,服务端把类名改了,客户端也不知道,符合面对接口编程
-
缺点:
-
1.客户端不得不死记硬背与服务端的映射关系,比如1代表汉堡包,2代表过桥米线。
-
2.如果工厂产品特别多,简单工厂会变得十分臃肿,如果有100个产品,上面的例子就要有100个case
-
3.最重要的是,如果客户端需要一个新的产品时,就需要修改简单工厂的代码,比如如果需要米饭产品,就需要修改简单工厂的代码, 当n=3时,新建一个米饭类,违反了开闭原则。
最后给大家看一下简单工厂模式的UML类图