浅谈Java设计模式系列0x02---简单工厂模式

浅谈Java设计模式系列0x00
浅谈Java设计模式系列0x01—单例模式

什么是工厂模式

工厂就是用来生产产品的地方,而在设计模式中,工厂就是一个创建各种对象的地方(类);
工厂通常包含一个或多个方法,用来创建该工厂所能创建的各种类型的对象;
它和上次的单例模式一样也是创建型模式;

什么是简单工厂模式

我认为可以用一句话来概括简单工厂模式的关键:

just say what you want,don’t worry the detail;

当然这句话只是我对这简单工厂模式的理解,你只要说你需要什么,不必关心它是怎样创建的;
因为简单工厂模式可以根据传进来的参数创建特定的对象,而且创建的对象都具有共同的父类;
在简单工厂模式中用来创建对象实例的方法都是静态方法,所以简单工厂模式又叫做静态工厂方法(Static Factory Method)模式;

什么时候可以使用简单工厂模式

  • 当工厂类负责创建的对象比较少的时候,此时的业务逻辑会比较简单
  • 使用者只知道传入工厂类的参数,其他的并不关心

模式结构

简单工厂模式主要包含的角色有:

  1. Factory : 工厂角色
    工厂角色负责实现创建所有实例的内部逻辑
  2. Product : 抽象产品角色
    抽象产品角色是创建的所有对象的父类,负责描述所有实例的共有接口
  3. Concrete Product : 具体产品角色
    具体产品角色是创建的目标,这就是使用者最后得到的对象

举个例子

代码参考
我们来个简单的例子,以手机工厂为例;
抽象产品接口:

1
2
3
4
public interface Phone {
//共有的接口方法
void call();
}

具体的产品类 Apple Phone:

1
2
3
4
5
6
public class ApplePhone implements Phone {
@Override
public void call() {
System.out.println("This is Apple Phone calling......");
}
}

一个具体的产品类 Android Phone:

1
2
3
4
5
6
public class AndroidPhone implements Phone {
@Override
public void call() {
System.out.println("This is Android Phone calling.....");
}
}

手机工厂类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class PhoneFactory {

/**
* 根据参数返回不同的实例对象
* @param type 手机类型
* @return 具体的手机对象
*/

public static Phone createPhone(String type) {

switch (type) {
case "android":
return new AndroidPhone();
case "apple":
return new ApplePhone();
}
return null;
}
}

测试类:

1
2
3
4
5
6
7
8
public class Client {
public static void main(String[] args) {
Phone android = (AndroidPhone) PhoneFactory.createPhone("android");
Phone apple = (ApplePhone) PhoneFactory.createPhone("apple");
android.call();
apple.call();
}
}

运行结果:

1
2
This is Android Phone calling.....
This is Apple Phone calling......

总结

简单工厂模式最大的优点在于实现对象的创建和对象的使用分离,将对象的创建交给专门的工厂类负责;
但是其最大的缺点在于工厂类不够灵活,增加新的具体产品需要修改工厂类的判断逻辑代码,而且产品较多时,工厂方法代码将会非常复杂。

参考

图说设计模式
工厂三兄弟之简单工厂模式