简单工厂模式并属于Gof 23个经典设计模式其中之一,只是通常会将它作为学习其他工厂设计模式的入门,而且在开发中,简单工厂模式也是比较常见的,设计思想比较简单。
1. 定义
简单工厂模式定义一个工厂类,提供获取对象的方法,根据入参的不同返回不同类的实例,通常被创建的实例对象都具有共同的父类,属于创建型模式。
在简单工厂模式中,包含3个角色,如下:
- 抽象产品角色:它作为要生产所有产品的抽象父类,封装了各种产品对象的共有方法,抽象产品角色的引入可以提高系统的灵活性,使得工厂类可以定义统一的返回值类型。
- 具体产品角色:它是简单工厂的创建产品,所有被工厂创建的对象都是抽象产品的子类实例。
- 工厂角色:工厂类是简单工厂模式的核心,负责实现创建产品的逻辑,它提供产品创建的方法,返回类型是抽象产品,可以被外部new,也可以通过工具类的形式调用。
2. 代码实现
简单工厂模式代码实现比较简单,我们举个例子,某个需求要求根据客户要求生产不同类型的笔,有铅笔,钢笔,毛笔。代码如下:
- 抽象的产品角色
// 1.抽象的产品角色
public abstract class Pen {
// 共有的业务方法:书写
protected abstract void write();
}
- 具体的产品角色
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
@Override
protected void write() {
System.out.println("写铅笔字!");
}
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
@Override
protected void write() {
System.out.println("写钢笔字!");
}
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
@Override
protected void write() {
System.out.println("写毛笔字!");
}
}
- 工厂角色
// 3.工厂角色
class PenFactory {
// 生成具体产品角色的方法
public static Pen createPen(String type) {
switch (type) {
case "pencil" :
return new Pencil();
case "fountainPen" :
return new FountainPen();
case "brushPen" :
return new BrushPen();
default:
return null;
}
}
}
- 客户端
class Client {
public static void main(String[] args) {
Pen pencil = PenFactory.createPen("pencil");
pencil.write();
Pen fountainPen = PenFactory.createPen("fountainPen");
fountainPen.write();
}
}
3.UML类图
简单工厂模式的类图也比较简单,如下图:
4. 简单工厂模式的简化
有时候为了简化简单工厂模式,可以将抽象产品角色和工厂类结合,将生产具体产品的静态方法放在抽象产品角色中实现,代码如下:
// 1.抽象的产品角色
public abstract class Pen {
// 共有的业务方法:书写
protected abstract void write();
// 生成具体产品的方法
public static Pen createPen(String type) {
switch (type) {
case "pencil" :
return new Pencil();
case "fountainPen" :
return new FountainPen();
case "brushPen" :
return new BrushPen();
default:
return null;
}
}
}
// 2.具体的产品角色-铅笔
class Pencil extends Pen {
@Override
protected void write() {
System.out.println("写铅笔字!");
}
}
// 2.具体的产品角色-钢笔
class FountainPen extends Pen {
@Override
protected void write() {
System.out.println("写钢笔字!");
}
}
// 2.具体的产品角色-毛笔
class BrushPen extends Pen {
@Override
protected void write() {
System.out.println("写毛笔字!");
}
}
// 3.客户端
class Client {
public static void main(String[] args) {
Pen pencil = Pen.createPen("pencil");
pencil.write();
Pen fountainPen = Pen.createPen("fountainPen");
fountainPen.write();
}
}
5. 简单工厂模式总结
5.1 优点
- 如所有工厂模式一样,简单工模式实现了对象的创建和使用过程分离,进一步解耦;
- 客户端无需知道对象的创建过程,只需知道所需产品的对应的类型参数即可;
- 通过一些配置文件及反射机制,可以更换生产的具体产品对象,提高系统的灵活性
5.2 缺点
- 工厂类集中了所有了产品对象的创建逻辑,职责过重,如果产品类型较多,代码可读性降低;
- 简单工厂类的引入增加了类的个数,变相的增加了系统的复杂度和理解难度;
- 增加新的具体产品角色时,需要修改工厂类的代码,违反了开闭原则,不利于系统扩展;
- 简单工厂模式所有具体产品角色都与工厂类耦合,无法对工厂类进行高层抽象,不利于扩展和维护。
5.3 适用场景
- 工厂类创建的对象比较少且比较明确,未来不会扩展新的产品角色类型;
- 客户端只关系创建对象的入参类型,不关心对象的创建过程;