Java 设计模式
简单工厂模式
简单工厂模式或者说工厂模式的关注点并不在于在工厂中是如何生产出来需要的类的,而在于将创建产品与消费产品分离
java中的应用:线程池的创建
工厂模式的优缺点
优点:
1、简单优化了软件体系结构,明确了各自功能模块的职责和权利
2、通过工厂类,外界不需要直接创建具体产品对象,只需要负责消费,不需要关心内部如何创建对象
缺点:
1、改进前的简单工厂模式全部创建逻辑都集中在一个工厂类中,能创建的类只能是考虑到的,如果需要添加新的类,就必须改变工厂类了
2、改进前的简单工厂模式随着具体产品的不断增多,可能会出现工厂类根据不同条件创建不同实例的需求,这种对条件的判断和对具体产品类型的判断交错在一起,很难避免功能模块的蔓延,对系统的维护和扩展不利
3、改进后的简单工厂模式主要是使用反射效率会低一些
工厂方法设计模式
工厂方法模式是类的创建模式。工厂方法模式的用意是定义一个创建产品对象的工厂接口,将实际创建工厂推迟到子类中。
java中的应用:ThreadFactory
工厂方法设计模式结构
1、抽象工厂角色
担任这个角色的是工厂方法模式的核心,任何在模式中创建对象的工厂类必须实现这个接口
2、具体工厂角色
担任这个角色的是实现了工厂接口的具体Java类,具体工厂角色与业务密切相关,并且随着使用者的调用以创建导出类
3、抽象导出角色
工厂方法模式所创建的对象的超类
4、具体导出角色
这个角色实现了抽象导出角色所声明的接口,工厂方法模式所创建的每一个对象都是某个具体角色导出角色的实例
单例设计模式
作为对象的创建模式,单例模式确保其某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类。单例模式有以下特点:
1、单例类只能有一个实例
2、单例类必须自己创建自己的唯一实例
3、单例类必须给其他所有对象提供这一实例
饿汉式、懒汉式
双检锁
public class DoubleCheckLockSingleton
{
//volatile 主要作用是保证instance在线程之间的可见性
// 防止指令优化重排序
private volatile static DoubleCheckLockSingleton instance = null;
private DoubleCheckLockSingleton() {}
public static DoubleCheckLockSingleton getInstance()
{
if (instance == null)
{
synchronized (DoubleCheckLockSingleton.class)
{
if (instance == null)
instance = new DoubleCheckLockSingleton();
}
}
return instance;
}
}
java中的应用:Runtime (每个Java应用程序都有一个Runtime类实例,使应用程序能够与其运行的环境相连接,可以通过getRuntime方法获取当前运行时。应用程序不能创建自己的Runtime类实例。)
单例模式的好处
1、控制资源的使用,通过线程同步来控制资源的并发访问
2、控制实例的产生,以达到节约资源的目的
3、控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信
原型设计模式
原型模式要求对象实现一个可以克隆机身的接口 克隆
可以通过复制一个实例对象本身来创建一个新的实例。这样一来,通过原型实例创建新的对象,就不再需要关心这个实例本身的类型,只要实现了克隆自身的方法,就可以通过这个方法来获取新的对象,而无须再通过new去创建。
原型模式的优点
原型模式是一种类的创建模式,简单工厂模式、工厂方法模式、单例模式、原型模式,客户端(调用方)都没有直接new一个类实例出来。把new一个类实例的动作由客户端(调用方)交给别人做而不是自己做,这就是创建型模式的宗旨。
使用原型模式创建对象比直接new一个对象在性能上好得多,因为Object类的clone()方法是一个native方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
使用原型模式的另一个好处是简化对象的创建,使得创建对象就像普通的复制黏贴一样简单。
Java中的应用:只要实现了Cloneanle接口的都可以看做是原型模式的应用 ArrayList
策略模式
策略模式的用意是针对一组算法,将每一个算法封装到具有共同接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。
策略模式是对算法的包装,是把使用算法的责任和算法本身分开。策略模式通常是把一系列的算法包装到一系列的策略类里面,作为一个抽象策略类的子类。
策略模式的重心不是如何实现算法(就如同工厂模式的重心不是工厂中如何产生具体子类一样),而是如何组织、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。特点是各策略算法的平等性
java中的应用:Comparator
策略模式的优缺点
1、避免了多重条件if...else if...else语句,多重条件语句并不容易维护
2、策略模式提供了管理相关算法簇的办法,恰当使用继承可以把公共代码移到父类,从而避免了代码重复
缺点
1、客户端必须知道所有的策略类,并自行决定使用 哪一个策略,这意味着客户端必须理解这些算法的区别,以便选择恰当的算法
浙公网安备 33010602011771号