可爱静

记录生活、学习和工作

0%

设计模式-工厂模式

工厂设计模式(Factory Pattern)是一种很常见的设计模式,属于创建型模式,主要作用就是来创建对象。

jZiB2npng

简单工厂模式

原理图

jZixxIpng

举个栗子

新建一个只提供返回品牌的接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.heifan.design.patterns.factory;

/**
* 品牌接口
* @author HiF
* @date 2022/6/27 21:45
*/
public interface LaptopI {

/**
* 返回品牌
* @param
* @return java.lang.String
* @author HiF
* @date 2022/6/27 21:46
*/
String brand();
}

实现接口

1
2
3
4
5
6
7
8
9
10
11
12
public class LenovoLaptop implements LaptopI {
@Override
public String brand() {
return "Lenovo";
}
}
public class MacLaptop implements LaptopI {
@Override
public String brand() {
return "Mac";
}
}

简单的工厂类

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

public static LaptopI createLapTop(String brand){
switch (brand){
case "Lenovo":
return new LenovoLaptop();
case "Mac":
return new MacLaptop();
default:
return null;
}
}


public static void main(String[] args) {
LaptopI mac = LaptopFactory.createLapTop("Mac");
String brand = mac.brand();
System.out.println(brand);
}
}

工厂设计模式

超类

超类可以是接口、抽象类、父类。

1
2
3
4
5
6
7
8
9
10
11
12
13
public abstract class Computer {

public abstract String getRAM();

public abstract String getHDD();

public abstract String getCPU();

@Override
public String toString() {
return "RAM= "+this.getRAM()+", HDD="+this.getHDD()+", CPU="+this.getCPU();
}
}

子类

子类 PC 和 Server 实现了 Computer:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class PC extends Computer{

private String ram;

private String hdd;

private String cpu;

public PC(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}

@Override
public String getRAM() {
return this.ram;
}

@Override
public String getHDD() {
return this.hdd;
}

@Override
public String getCPU() {
return this.cpu;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Server extends Computer{

private String ram;

private String hdd;

private String cpu;

public Server(String ram, String hdd, String cpu){
this.ram=ram;
this.hdd=hdd;
this.cpu=cpu;
}

@Override
public String getRAM() {
return this.ram;
}

@Override
public String getHDD() {
return this.hdd;
}

@Override
public String getCPU() {
return this.cpu;
}
}

工厂类

基于相同的参数类型,返回了不同的对象:

1
2
3
4
5
6
7
8
9
10
11
public class ComputerFactory {

public static Computer getComputer(String type, String ram, String hdd, String cpu) {
if ("PC".equals(type)) {
return new PC(ram, hdd, cpu);
}else if ("Server".equals(type)){
return new Server(ram, hdd, cpu);
}
return null;
}
}

测试

1
2
3
4
5
6
7
8
9
public class TestFactory {

public static void main(String[] args) {
Computer pc = ComputerFactory.getComputer("PC", "2 GB", "500 GB", "2.4 GHz");
Computer server = ComputerFactory.getComputer("Server", "16 GB", "1 TB", "2.9 GHz");
System.out.println("Factory PC Config::" + pc);
System.out.println("Factory Server Config::" + server);
}
}

输出:

1
2
Factory PC Config::RAM= 2 GB, HDD=500 GB, CPU=2.4 GHz
Factory Server Config::RAM= 16 GB, HDD=1 TB, CPU=2.9 GHz

工厂设计模式的优点

  • 面向接口编程,体现了面向对象的思想;

  • 将创建对象的工作转移到了工厂;

JDK中的工厂设计模式

  • java.util.Calendar, ResourceBundle and NumberFormat getInstance() 使用了工厂方法模式;
  • valueOf() 在包装类中,如Boolean, Integer 也使用了工厂方法模式;