JAVA设计模式
什么是设计模式?
-
设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案,设计模式(Design pattern)代表了最佳的实践。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
-
设计模式的本质提高软件的维护性,通用性和扩展性,并降低软件的复杂度。
-
设计模式并不局限于某种语言,java,php,c++都有设计模式.
设计模式分为三种类型,共23种
-
创建型模式:单例模式、抽象工厂模式、原型模式、建造者模式、工厂模式。
-
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
-
行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式)
提示:以下是本篇文章正文内容,下面案例可供参考
一、单例模式
-
所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法)。
-
单例模式有八种方式:
- 饿汉式 (静态常量)
- 饿汉式 (静态代码块)
- 懒汉式 (线程不安全)
- 懒汉式 (线程安全,同步方法)
- 懒汉式 (线程安全,同步代码块)
- 双重检查
- 静态内部类
- 枚举
1. 饿汉式(静态常量)
步骤如下:
-
构造器私有化 (防止 new )
-
在类的内部创建对象
-
向外提供一个静态的公共方法,getInstance()
代码实现:
package exercise;
public class Singleton01 {
// 私有化构造函数 使得不能再new出一个对象(因为单例模式只能存在一个对象实例)
private Singleton01(){
}
// 先直接创建一个 Singleton01 实例
private static Singleton01 instance = new Singleton01();
// 向外面提供一个静态方法 getInstance() 用于返回实例
public static Singleton01 getInstance(){
return instance;
}
}
优缺点说明:
- 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
- 缺点: 在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费
- 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数都是调用getInstance方法, 但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
- 结论:这种单例模式可用,但是有可能造成内存浪费
2. 饿汉式(静态代码块)
步骤如下:
-
构造器私有化 (防止 new )
-
在类的内部创建对象
-
向外提供一个静态的公共方法,getInstance()
代码实现:
package exercise;
public class Singleton01 {
// 私有化构造函数 使得不能再new出一个对象(因为单例模式只能存在一个对象实例)
private Singleton01(){
}
// 先直接创建一个 Singleton01 实例
private static Singleton01 instance = new Singleton01();
// 向外面提供一个静态方法 getInstance() 用于返回实例
public static Singleton01 getInstance(){
return instance;
}
}
优缺点说明:
- 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
- 缺点: 在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费
- 这种方式基于classloder机制避免了多线程的同步问题,不过,instance在类装载时就实例化,在单例模式中大多数都是调用getInstance方法, 但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
- 结论:这种单例模式可用,但是有可能造成内存浪费
3. 懒汉式(线程不安全)
提供一个静态的公有方法,当使用到该方法时,才去创建 instance
代码实现:
package exercise;
public class Singleton03 {
public static void main(String[] args) {
System.out.println("懒汉式 1 , 线程不安全~");
Singleton instance = Singleton.getInstance();
Singleton instance2 = Singleton.getInstance();
System.<