一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第24天,点击查看活动详情。
这篇文章我们讲一下日常开发中常用到的一种设计模式:工厂模式。
一、概念
工厂模式在Java 开发中很常见,根据名字我们可以看出,它其实就是作为一个“工厂”,来创建对象。
设计模式分为三大类(创建型、结构型、行为型),工厂模式属于创建型模式。
工厂模式的工作流程是:
- 先定义一个创建对象的接口
- 然后子类实现接口,然后子类自行决定实例化哪一个工厂类
总结来说就是,工厂模式让对象的创建过程延迟到子类进行。
二、代码示例
对于开发者而言,有时候文字会显得比较苍白,所以我决定将文章的结构设计成如下模式:先简单介绍一下设计模式的基本概念,然后就用实际的代码做例子,最后围绕示例代码,再对设计模式的具体实现做讲解。
下面我们来看工厂模式的代码示例。
- 首先定义一个接口:
public interface Person {
void gender();
}
- 创建接口的实现类
public class Man implements Person{
@Override
public void gender() {
System.out.println("this is a man");
}
}
public class Woman implements Person{
@Override
public void gender() {
System.out.println("this is a woman");
}
}
- 创建一个工厂,用于根据指定的信息,生成不同的对象。
public class PeopleFactory
public Person getPerson(String personType) {
if ("man".equals(personType)) {
return new Man();
} else if ("woman".equals(personType)) {
return new Woman();
} else {
return null;
}
}
}
- 使用这个工厂,根据传递的类型信息来生成不同的实体对象
public class ForStaticTest {
public static void main(String[] args) {
PeopleFactory peopleFactory = new PeopleFactory();
Person man = peopleFactory.getPerson("man");
man.gender();
Person woman = peopleFactory.getPerson("woman");
woman.gender();
}
最后输出结果:
this is a man
this is a woman
根据上述例子我们可以看出,使用工厂方法分为四个步骤:
- 定义一个产品接口
- 创建接口的实现子类
- 根据前两步的接口和实现的子类创建工厂
- 使用
三、工厂方法的具体分析
工厂方法的一个很明显的特点就是,我们很明确地知道我们的“产品”是什么,同时知道其对应的类型是什么。
也就是说,我们知道在什么条件下,创建什么类型的实例。同时这个条件类型和实例类型我们都是确定的。
让子类实现工厂接口,在工厂中,返回的也是一个抽象的产品。
关键代码:创建过程在其子类执行。
工厂模式的优点:
- 使用简单:调用者如果想创建一个对象,只要知道需要向“工厂”中传递的名称就可以了。
- 方便扩展:使用者如果想增加一个新的产品类型(对应上面的例子,就是新加一个接口,比如说新增一个宠物Pet 类型),只要扩展一个新的工厂类就可以了。
- 屏蔽细节:工厂内部的具体实现对使用者是透明的,使用者只需要知道接口如何调用即可。
工厂模式的缺点:
- 每次增加一个产品时,都需要增加一个具体实现子类,同时需要修改工厂。
- 如果要新增产品的类型(对应新增接口),那么就要新增工厂、新增接口、新增实现子类。系统中类的个数成倍增加,会增加系统的复杂度,同时也会增加了系统具体类之间的依赖。
四、总结
工厂模式有时候也叫做简单工厂模式,作为一种创建类模式,在一些需要生成复杂对象的地方,我们如果想对用户屏蔽细节,那么都可以使用工厂方法模式。
需要注意,对于复杂对象适合使用工厂模式,而对于简单对象,比如说只需要通过new 就可以完成创建的对象,就不需使用工厂模式,这样会无端增加系统复杂度。(如果使用工厂模式,最基本的就需要引入一个工厂类,然而并没有对开发带来什么方便。)
以上就是对“工厂模式”的简单介绍。当时,具体应用场景要具体分析,从而确定如何使用。