JAVA基础(四)设计模式总结及单件模式

最近重读Head First的设计模式,感觉还是有必要重新总结一下,以便之后进行复习,先把书中提到的设计模式罗列一遍:
设计模式分类如下:
创建型模式:涉及到将对象实例化,这类模式都提供一个方法,将客户从所需要实例化的对象中解耦。
单件模式Singleton:确保一个类只有一个实例,并提供一个全局访问点
工厂模式Factory Method:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类
抽象工厂Abstract Factory:抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。
生成器模式Builder(简述)
原型模式Prototype(简述)


行为型模式:只要是行为型模式,都涉及到类和对象如何交互及分配职责
策略模式Strategy:定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
观察者模式Observer:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新
命令模式Command:将“请求”封装成对象,以便使用不同的请求,队列或者日志来参数化其他对象。命令模式也支持可撤销的操作
模板方法Template Method:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
迭代器模式Iterator:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
状态模式State:允许对象在内部状态改变是改变它的行为,对象看起来好像修改了它的类。
责任链模式Chain of Responsibility(简述)
解释器模式Interpreter(简述)
中介者Mediator(简述)
备忘录Memento(简述)
访问者Visitor(简述)


结构型模式:把类或对象组合到更大的结构中
装饰者模式Decorator:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案
适配器模式Adapter:将一个类的接口,转换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
外观模式Facade:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。
组合模式Composite:允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合能让客户以一致的方式处理个别对象以及对象组合。
代理模式Proxy:为另一个对象提供一个替身或占位符以控制对这个对象的访问。

桥接模式Bridge(简述)
蝇量模式Flyweight(简述)

以上是设计模式的概述,在之后的学习中,会陆续对各个模式进行总结,本章节首先进行单件模式的总结,虽然单件模式不是HEAD FIRST第一个模式,不过谁叫他最简单呢。。。
首先再描述一遍单件模式的定义:
单件模式Singleton:确保一个类只有一个实例,并提供一个全局访问点
单件模式的原理很单纯,其核心仅仅在于私有构造器和公有静态访问方法,并通过访问方法完成对象的存在性校验和创建工作。具体方法重要有以下几种
1.懒汉模式和饿汉模式
差别仅仅在于前者在访问方法中完成创建,后者则在定义时完成了创建:
懒汉模式代码:
public class Singleton {
	private static Singleton uniqueInstance;
	private Singleton(){};
	public static Singleton getInstance(){	
		if(uniqueInstance == null){		// 对象未创建时创建一个
			uniqueInstance = new Singleton();
		}
		return uniqueInstance;
	}
}

饿汉模式代码:
public class Singleton {
	private static Singleton uniqueInstance = new Singleton();	//提前创建好对象
	private Singleton(){};
	public static Singleton getInstance(){	
		return uniqueInstance;
	}
}

2、关于线程安全
如果要保证单件模式的线程安全,最可靠的方法是采用同步锁,这样可以保证获取的对象是唯一的:
public static synchronized Singleton getInstance()	//防止多线程获取不同对象


但是,由于JAVA自身的synchronize效率问题(拖慢100倍左右),为了尽可能降低同步带来的效率损耗,只在初次创建对象的时候进行同步操作,这也被称为双重检查:
public class Singleton {
	private volatile static Singleton uniqueInstance;//声明为volatile以及时更新对象
	private Singleton(){};
	public static Singleton getInstance(){	
		if(uniqueInstance == null){		
			synchronized (Singleton.class) {	//只在确定不存在对象的时候使用同步代码块加锁
				if(uniqueInstance==null){
					uniqueInstance = new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

还有一点需要留意,JAVA的反射机制由于可以访问私有构造器,因此会造成单件模式失效
到此,单件模式就基本介绍完了,


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值