软件工程中,设计模式(design pattern)是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。

a

单例设计模式

单例对象的类必须保证只有一个实例存在。

推荐使用饿汉式单例设计模式

饿汉式单例设计模式

  1. 私有化构造函数。
  2. 声明本类的引用类型变量,并且使用该变量指向本类对象。
  3. 提供一个公共静态的方法获取本类的对象。
 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. 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象 ,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象, 然后再返回。
 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();