0%

设计模式-工厂模式

主要功能:把对象的实例化部分抽取了出来,降低了系统中代码耦合度,增强了系统的扩展性。

工厂模式分为简单工厂模式,工厂方法模式和抽象工厂模式。

1.简单工厂

1
2
3
4
5
6
7
8
9
10
/**
* 简单工厂:简单工厂把对象的实例化单独放到一个类中去维护。
* 工厂角色:
* 用户类:不同用户需要不同的产品
* 产品类:不同的产品类对应不同的产品
* 工厂类:根据用户不同的需求产生不同的产品实例化对象
* 例子:
* 用户需要各种不同的产品,不同的客户类中创建了不同的产品类,产品类发生改变时,每个用户类内部需要改变。
* 简单工厂对客户类和产品类之间解耦。工厂类去对各个产品类实例化。每个客户类不去new产品类,而是通过访问Factory获得需要的产品类对象。
*/

Implementation

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
//产品
public interface Product {
}

public class ProductNumber1 implements Product {
}

public class ProductNumber2 implements Product {
}

public class ProductNumber3 implements Product {
}

//工厂
public class Factory {
public Product createProduct(int type) {
if (type == 1) {
return new ProductNumber1();
} else if (type == 2) {
return new ProductNumber2();
}
return new ProductNumber3();
}

}

2.工厂方法

把对象实例化的管理放到一个核心工厂类和n个工厂子类中去维护。

核心工厂:接口,定义创建产品对象的接口方法。

工厂子类:实例化产品类。

新增产品时,只需新增产品子类和工厂子类,不需要改变原有工厂类代码。扩展性更好。

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
//产品 无改变
public interface Product {
}

public class ProductNumber1 implements Product {
}

public class ProductNumber2 implements Product {
}

//工厂方法
//核心工厂
interface FactoryMethod {
Product getProduct();
}

//工厂子类
public class Factroy1 implements FactoryMethod {
@Override
public Product getProduct(){
return new ProductNumber1() {};
}
}

//工厂子类
public class Factroy2 implements FactoryMethod {
@Override
public Product getProduct(){
return new ProductNumber2() {};
}
}

3.抽象工厂

把对象实例化的管理放到一个核心工厂类的方法和n个工厂子类的方法中去维护。

新增新产品时,添加产品类,核心工厂和工厂子类添加对应的实现方法。

抽象工厂的优势:可新增同类型的工厂。

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//产品 无改变
public interface Product {
}

public class ProductNumber1 implements Product {
}

public class ProductNumber2 implements Product {
}


//核心工厂
public abstract class AbstractFactory {
public abstract Product getProduct1();
public abstract Product getProduct2();
}

//产品实现
public class ProductFactory extends AbstractFactory {

@Override
public Product getProduct1() {
return new ProductNumber1();
}

@Override
public Product getProduct2() {
return new ProductNumber2();
}
}


//新增单一产品
//产品 新增一个产品类
public interface Product {
}

public class ProductNumber1 implements Product {
}

public class ProductNumber2 implements Product {
}

public class ProductNumber3 implements Product {
}

//核心工厂 新增获取产品的抽象方法
public abstract class AbstractFactory {
public abstract Product getProduct1();
public abstract Product getProduct2();
public abstract Product getProduct3();
}

//产品实现 新增产品的实现方法
public class ProductFactory extends AbstractFactory {

@Override
public Product getProduct1() {
return new ProductNumber1();
}

@Override
public Product getProduct2() {
return new ProductNumber2();
}

@Override
public Product getProduct3() {
return new ProductNumber3();
}
}