设计模式——创建型模式(四)

Singletion(单例模式)

目标

保证一个类只有一个实例,并且提供一个访问它的全局访问点。

结构

结构图

图中反映的是所谓懒汉式单例模式——但需要这样一个对象的时候才开始创建这样的一个对象。相反,还有一种勤劳单例模式,当这个类被加载的时候就会创建这样一个单例对象。

协作

时序图

  1. 当用户需要的时候,向类请求一个对象;

  2. 类如果没有创建这个单例对象,就会创建这个对象并且传递回来,如果类已经创建了这个对象,那么就直接简单地将对象传递回来即可。

适用情形

  1. 当类只能有一个实例并且用户将会从一个众所周知的访问点访问它;

  2. 当这个唯一实例是通过子类化可扩展的,并且客户应该无须更改代码就能使用一个扩展的实例时。

参与者

  • Singleton

    定义一个Instance操作,并且维护一个自己的唯一实例。

效果

  1. 对唯一实例的受控访问;

  2. 缩小名空间(对于java来说不存在命名空间);

    避免了过多的全部变量的出现,使得命名空间更加精简。

  3. 允许对操作和表示的精化;

    ???不是很懂书上在说啥(

  4. 可以改变成多个可控数目的实例。

Tips

  1. 使用单例注册表来进行单例的子类的创建。

    Singleton可以将自己的众多子类存放在某个映射表中,然后以某一个字符串或者其他来进行访问注册。(注册过程可以随意地方实现)

代码实例

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
abstract class AbstractFactory{
private static HashMap<String, AbstractFactory> registerMap = new HashMap<>();
protected AbstractFactory() {}
public static AbstractFactory instance(String brand) {
if(!registerMap.containsKey(brand)) {
switch(brand) {
case "benz": {
registerMap.put(brand, BenzFactory.instance());
break;
}
case "Audi": {
registerMap.put(brand, AudiFactory.instance());
break;
}
}
}
return registerMap.get(brand);
}
abstract Car makeCar();
abstract Cushion makeCushion();
}
class BenzFactory extends AbstractFactory{
private static BenzFactory factory;
private BenzFactory() {super();}
public static BenzFactory instance() {
if (factory == null) {
factory = new BenzFactory();
}
return factory;
}
@Override
Benz makeCar() {}
@Override
BenzCushion makeCushion() {}
}
class AudiFactory extends AbstractFactory{
private static AudiFactory factory;
private AudiFactory() {super();}
public static AudiFactory instance() {
if (factory == null) {
factory = new AudiFactory();
}
return factory;
}
@Override
Audi makeCar() {}
@Override
AudiCushion makeCushion() {}
}
public class Client {
public void static main(String[] args){
AbstractFactory factoryA = new BenzFactory();
AbstractFactory factoryB = new AudiFactory();
Car a = factoryA.makeCar();
Cushion cushionA = factoryA.makeCushion();
Car b = factoryB.makeCar();
Cushion cushionB = factoryB.makeCushion();
a.addCushion(cushionA).run();
b.addCushion(cushionB).run();
}
}

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2018 Alex's Blog All Rights Reserved.

Yifeng Tang hält Urheberrechtsansprüche.