前言:这是我初学设计模式过程中所写的,若有错误希望能够指出(Thank >-<)
简单工厂的介绍
简单工厂模式属于创建模式的一种(设计模式分为几大类创建模式是其中的一种),又称静态工厂方法模式(在设计模式中有简单工厂模式、工厂方法模式和抽象工厂模式)。该模式的主要点在于创建一个简单工厂类,该类的功能是根据传入的选择参数来返回对应对象实例。
简单工厂模式的UML图
注:图片来源于网络
简单工厂的简单举例
杯子对于大家都不陌生,现在有两种杯子,普通的杯子和保温杯,我们需要通过工厂模式来实现在用户不同的选择下,使用杯子来存水。
(1)首先我们先写杯子的抽象类Cup(就上图中的product类)
/**
* @Introduction 该类是一个杯子的抽象类,主要方法是保存水
*/
public abstract class Cup {
public abstract void saveWater();
}
(2)实现Cup抽象类的一个具体子类NormalCup类(不同杯子类)
/**
*
* @Introduction 该类是普通杯子类,该类继承了Cup类并且重写了其中的方法
*
*/
public class NormalCup extends Cup{
/**重写存水方法*/
@Override
public void saveWater() {
System.out.println("使用普通杯子存水");
}
}
(3)实现Cup抽象类的一个具体子类VacuumCup类(保温杯类)
/**
* @Introduction 该类是Cup类的一个实现类,该类为保温杯类,主要功能是使水温恒定
*
*/
public class VacuumOfCup extends Cup {
/** 实现了Cup的方法 */
@Override
public void saveWater() {
System.out.println("使用保温杯来存水");
}
}
(4)最后实现简单工厂的核心类——简单工厂类
/**
*
* @Introduction 该类是简单工厂类,在该类的主要方法是通过用户选择使用的杯子来返回对应杯子的实例对象
*/
public class SimpleFactory {
private Cup cup;//父类对象的引用指向子类对象
/**根据用户的选择来返回对应对象的实例(简单工厂的主要部分)*/
public Cup getCup(String tag){
switch(tag){//通过switch结构实现
case "normal":
this.cup=new NormalCup();
break;
case "vacuum":
this.cup=new VacuumOfCup();
break;
default:
System.out.println("选择有误");
}
return this.cup;
}
}
(5)在用户界面调用简单工厂类与用户的选择
/**
*
* @Introduction 模拟用户界面
*
*/
public class Main {
public static void main(String[] args){
SimpleFactory factory=new SimpleFactory();//定义一个简单的工厂类
Cup cup1=factory.getCup("normal");
cup1.saveWater();
Cup cup2=factory.getCup("vacuum");
cup2.saveWater();
}
}
上述例子的分析
在上面例子中我们一共创建了三个具体类以及一个抽象类(不包括Main类)。通过其中不难发现最核心的类就是SimpleFactory类,在类的功能就是通过用户的选择来返回对应的具体类的实例(就像一个类实例的制造工厂一样),然后比较重要的是Cup抽象类,该抽象类是通过题意分析所得的,该抽象类主要是提供一个指向具体子类的引用,并且调用对应子类的方法(在子类的saveWater方法),然后对于Cup抽象类的两个具体类,主要是在简单工厂类中作为实例被返回。这就是一个简单工厂的运用(就问简不简单)
关于简单工厂的优劣分析
优点:
- 将业务逻辑和界面逻辑进行了分离,将选择结构放在简单工厂内部
- 提高了程序的可拓展性(就上例来说如果我们需要再加一个纸杯类,只需要创建一个纸杯类和在简单工厂中加入一个分支即可)
缺点:
- 违反了设计原则的开放—封闭原则(对拓展是开放的,对修改是封闭的),很显然在简单工厂模式中如果我们要加一个功能就需要修改简单工厂中的代码,这不符合我们的要求(上面只是一个简单的案例,如果代码是一个软件的核心代码还能在原代码上轻易修改吗?)
- 违反了单一职责原则(简单工厂类中的功能不是单一的),注意如果上面的案例再复杂一点,用户的选择更加多,该简单工厂就会显得太过于复杂,会降低该模块的内聚度(这样会导致难以维护和复用,以及差的灵活性)
简单工厂模式的使用场景
对于需要实现的具体类数目比较少的条件下