工厂相关设计模式汇总

原创 KimZing 2020-03-30 15:41

属于创建型设计模式,创建型模式设计对象的实例化,这类模式的特点是,不让用户依赖于对象的创建或排列方式,避免用户直接使用new运算符创建对象。

简单工厂设计模式

核心简述

使用一个工厂类,通过传入的不同参数返回不同的实例对象,通常是某一类型的不同子类。创建的实体类拥有共同的接口或父类。

使用场景

  1. 需要创建的对象较少,且很少会进行修改。
  2. 客户端不关心对象创建过程

优点

可以对创建的对象进行加工,对客户端隐藏细节

缺点

  1. 创建逻辑复杂或创建对象过多而造成代码臃肿

  2. 新增删除子类需要修改工厂类,违反了开闭原则

代码示例

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
public class MouseFactory {

public static Mouse createMouse(int type) {
switch (type) {
case 0:
return new DellMouse();
case 1:
return new HpMouse();
default:
return new DellMouse();
}
}

public static void main(String[] args) {
createMouse(1).click();
createMouse(2).click();
}

}


public interface Mouse {

void click();

}

public class DellMouse implements Mouse {
@Override
public void click() {
System.out.println("Dell Click");
}
}

public class HpMouse implements Mouse{
@Override
public void click() {
System.out.println("Hp Click");
}
}

工厂方法设计模式

核心简述

为了符合开闭原则,不修改现有的工厂类,所以对工厂类也做了分类,不同类型的实例使用不同的实例工厂,所有实例工厂拥有共同的工厂父类或接口。

优点

对客户端隐藏对象创建细节

缺点

  1. 创建一个新的类型时,需要创建对应的实例类型和工厂类型,双倍的代码编写
  2. 只能创建同一种类型的对象,无法满足多种类型的创建。

代码示例

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 interface MouseFactory {

Mouse createMouse();

}


public class DellMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}
}

public class HpMouseFactory implements MouseFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}
}

public class MethodFactoryDemo {

public static void main(String[] args) {
MouseFactory factory = new DellMouseFactory();
factory.createMouse().click();
}

}

抽象工厂设计模式

工厂方法虽然可以做到开闭原则,但是无法创建不同的对象类型,抽象工厂模式则可以解决这一个问题,可以认为抽象工厂抽象的是产品的类型,支持不同产品的创建。

个人理解抽象工厂并不是对工厂方法的扩展,而是从对象的类型角度进行了区分,抽象工厂支持不同对象类型的创建,而工厂方法仅是针对同一种对象类型做创建。

优点

可以创建不同类型的对象,新增一个工厂是不会违反开闭原则的。

缺点

新增一个产品类型,仍然需要修改各个工厂类,违反开闭原则

代码示例

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
public interface ComputerFactory {

Mouse createMouse();

Keyboard createKeyboard();

}

public class DellComputerFactory implements ComputerFactory {
@Override
public Mouse createMouse() {
return new DellMouse();
}

@Override
public Keyboard createKeyboard() {
return new DellKeyboard();
}
}

public class HpComputerFactory implements ComputerFactory {
@Override
public Mouse createMouse() {
return new HpMouse();
}

@Override
public Keyboard createKeyboard() {
return new HpKeyboard();
}
}

public class AbstractFactoryDemo {

public static void main(String[] args) {
ComputerFactory computerFactory = new DellComputerFactory();
computerFactory.createKeyboard().beat();
computerFactory.createMouse().click();
}

}

public interface Keyboard {

void beat();

}


public class HpKeyboard implements Keyboard {
@Override
public void beat() {
System.out.println("惠普 键盘");
}
}


public class DellKeyboard implements Keyboard {
@Override
public void beat() {
System.out.println("戴尔 键盘");
}
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×