工厂模式是创造型模式的一种,在java框架如Spring,struts2被广泛运用

该模式运用于:当程序中有一父类和一堆子类,子类的创建是根据输入的不同返回不同的子类
实例。此时只要实现一个工厂类负责不同子类的返回,代替客户端程序来返回实例。

下面例子使用Computer的类来说明工厂模式的实现机制

超类

Computer.java

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.walterlife.dp.FactoryDP;

public abstract class Computer {
public abstract String getRam();
public abstract String getHdd();
public abstract String getCpu();

public String toString() {
return "RAM: " + getRam()
+ " HDD: " + getHdd()
+ " CPU: " + getCpu();
}
}

子类

PC.java

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.walterlife.dp.FactoryDP;

public class PC extends Computer {
public String ram;
public String hdd;
public String cpu;

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

/**
* @return the ram
*/

public String getRam() {
return ram;
}

/**
* @param ram the ram to set
*/

public void setRam(String ram) {
this.ram = ram;
}

/**
* @return the hdd
*/

public String getHdd() {
return hdd;
}

/**
* @param hdd the hdd to set
*/

public void setHdd(String hdd) {
this.hdd = hdd;
}

/**
* @return the cpu
*/

public String getCpu() {
return cpu;
}

/**
* @param cpu the cpu to set
*/

public void setCpu(String cpu) {
this.cpu = cpu;
}
}

Server.java

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package com.walterlife.dp.FactoryDP;

public class Server extends Computer {
public String ram;
public String hdd;
public String cpu;

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

/**
* @return the ram
*/

public String getRam() {
return ram;
}

/**
* @param ram the ram to set
*/

public void setRam(String ram) {
this.ram = ram;
}

/**
* @return the hdd
*/

public String getHdd() {
return hdd;
}

/**
* @param hdd the hdd to set
*/

public void setHdd(String hdd) {
this.hdd = hdd;
}

/**
* @return the cpu
*/

public String getCpu() {
return cpu;
}

/**
* @param cpu the cpu to set
*/

public void setCpu(String cpu) {
this.cpu = cpu;
}
}

工厂类

ComputerFactory.java, 是一个工厂类,根据不同的电脑类型产出不同类型的电脑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package  com.walterlife.dp.FactoryDP;

import org.apache.log4j.Logger;

public class ComputerFactory {
static Logger logger = Logger.getLogger(ComputerFactory.class);

public static Computer getComputer(String type, String ram, String hdd, String cpu) {
Computer computer = null;
if("pc".equalsIgnoreCase(type)) {
computer = new PC(ram, hdd, cpu);
} else if("server".equalsIgnoreCase(type)) {
computer = new Server(ram, hdd, cpu);
} else {
logger.warn("type: " + type + " is not exist!!!");
}
return computer;
}
}

测试代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static void testFactoryDP() {
Computer pc = ComputerFactory.getComputer("pc", "2.GB", "500GB", "2.4 GHz");
Computer server = ComputerFactory.getComputer("server", "16GB", "1TB", "4 GHz");

if(pc != null) {
logger.info("PC config :" + pc.toString());
} else {
logger.warn("PC instace is null!!!");
}

if(server != null) {
logger.info("Server config :" + server.toString());
} else {
logger.warn("Server instace is null!!!");
}
}

输出

1
2
2015-08-23 18:14:06 INFO  com.walterlife.dp.App testFactoryDP:26 -> PC config :RAM: 2.GB HDD: 500GB CPU: 2.4 GHz
2015-08-23 18:14:06 INFO com.walterlife.dp.App testFactoryDP:32 -> Server config :RAM: 16GB HDD: 1TB CPU: 4 GHz

使用工厂模式的好处

  1. 工厂模式是面向接口的,而不是面向实现的
  2. 工厂模式将具体子类的创建从客户端代码分离,实现了松耦合,易于扩展

留言