在软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。
单例设计模式
单例对象的类必须保证只有一个实例存在。
推荐使用饿汉式单例设计模式
饿汉式单例设计模式
- 私有化构造函数。
- 声明本类的引用类型变量,并且使用该变量指向本类对象。
- 提供一个公共静态的方法获取本类的对象。
1
2
3
4
5
6
7
8
9
10
| class Single{
//声明本类的引用类型变量,并且使用该变量指向本类对象
private static Single s = new Single();
//私有化构造函数
private Single(){}
//提供一个公共静态的方法获取本类的对象
public static Single getInstance(){
return s;
}
}
|
懒汉式单例设计模式
- 私有化构造函数。
- 声明本类的引用类型变量,但是不要创建对象,
- 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象
,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,
然后再返回。
1
2
3
4
5
6
7
8
9
10
11
12
13
| class Single2{
//声明本类的引用类型变量,不创建本类的对象
private static Single2 s;
//私有化了构造函数
private Single2(){}
//懒汉式设计模式有线程安全问题 简单解决:synchronized
public static synchronized Single2 getInstance(){
if(s==null){
s = new Single2();
}
return s;
}
}
|
工厂设计模式
工厂方法模式(常用)
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。
适用场景:
(1)客户端不需要知道它所创建的对象的类。例子中我们不知道每个图片加载器具体叫什么名,只知道创建它的工厂名就完成了床架过程。
(2)客户端可以通过子类来指定创建对应的对象。
以上场景使用于采用工厂方法模式。
现在需要设计一个这样的图片加载类,它具有多个图片加载器,用来加载jpg,png格式的图片,每个加载器都有一个read()方法,用于读取图片。
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
| //编写一个加载器的公共接口。
public interface Reader {
void read();
}
//Jpg图片加载器
public class JpgReader implements Reader {
@Override
public void read() {
System.out.print("read jpg");
}
}
//Png图片加载器
public class PngReader implements Reader {
@Override
public void read() {
System.out.print("read png");
}
}
//定义一个抽象的工厂接口ReaderFactory
public interface ReaderFactory {
Reader getReader();
}
//Jpg加载器工厂
public class JpgReaderFactory implements ReaderFactory {
@Override
public Reader getReader() {
return new JpgReader();
}
}
//Png加载器工厂
public class PngReaderFactory implements ReaderFactory {
@Override
public Reader getReader() {
return new PngReader();
}
}
//读取Jpg
ReaderFactory factory=new JpgReaderFactory();
Reader reader=factory.getReader();
reader.read();
//读取Png
ReaderFactory factory=new PngReaderFactory();
Reader reader=factory.getReader();
reader.read();
|
文章作者
itning
上次更新
2018年06月07日 09:20:29
许可协议
CC BY-NC-ND 4.0