设计模式课程二:工厂模式之简单工厂
本次课程来跟小船同学一起学习工厂模式!
工厂模式定义:定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中。这满足创建型模式中所要求的“创建与使用相分离”的特点。
我们把被创建的对象称为“产品”,把创建产品的对象称为“工厂”。
工厂模式分为 简单工厂、工厂方法、抽象工厂 三种。
简单工厂
如果要创建的产品不多,只要一个工厂类就可以完成,这种模式叫“简单工厂模式”。
通过一个工厂类负责创建不同的产品,此类中通常提供一个静态方法,根据传入参数的不同来创建不同产品。
简单工厂模式不属于23种设计模式。同时简单工厂在新增产品时,需要修改工厂类,违背了开闭原则。
简单工厂模式的优缺点和使用场景
-
优点
- 产品的创建全部委托给工厂类负责,客户端不需要关心产品创建的过程,只需要决定使用哪一种产品类型即可,实现了责任的分割;
-
缺点
- 类的创建工作全部交给一个工厂类负责,一旦逻辑发生异常将影响整个系统;工厂类中的代码过于臃肿;
- 产品类型扩展困难,必须修改工厂类的逻辑,当产品类型过多时,可能造成逻辑过于复杂,不易理解和维护;
- 工厂类使用静态方法,使得工厂类无法形成基于继承的等级结构。
-
使用场景
对于产品种类相对较少的情况,考虑使用简单工厂模式。
简单工厂模式的类图
简单工厂模式Java示例
// 产品接口,这里模拟产品是船
public interface IBoat {
void start();
}
// 产品的两个实现,大船和小船
public class BigBoat implements IBoat {
@Override
public void start() {
System.out.println("我是一艘大船,我要启航了..");
}
}
public class SmallBoat implements IBoat {
@Override
public void start() {
System.out.println("我是一只小船,我要开始划水了..");
}
}
// 简单工程实现
public class SimpleBoatFactory {
/**
* 根据条件生产不同的船
*
* @param type 船的类型
*/
public static IBoat produceBoat(String type) {
if ("small".equals(type)) {
return new SmallBoat();
}
if ("big".equals(type)) {
return new BigBoat();
}
return null;
}
}
// 调用
public static void main(String[] args) {
// 生产一条小船
SimpleBoatFactory.produceBoat("small").start();
// 生产一艘大船
SimpleBoatFactory.produceBoat("big").start();
}
// 运行结果
我是一只小船,我要开始划水了..
我是一艘大船,我要启航了..