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

来源:互联网 发布:南京证券开户软件 编辑:程序博客网 时间:2024/05/18 04:00
最近重读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的反射机制由于可以访问私有构造器,因此会造成单件模式失效
到此,单件模式就基本介绍完了,


原创粉丝点击