单例模式
懒汉模式
**是否 Lazy 初始化:**是
**是否多线程安全:**否
**实现难度:**易
**描述:**这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。
这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。
private Singleton() {
}
public static Singleton instance = null;
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
饿汉模式
**是否 Lazy 初始化:**否
**是否多线程安全:**是
**实现难度:**易
**描述:**这种方式比较常用,但容易产生垃圾对象。
优点:没有加锁,执行效率会提高。
缺点:类加载时就初始化,浪费内存。
它基于 classloader 机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,虽然导致类装载的原因有很多种,在单例模式中大多数都是调用 getInstance 方法, 但是也不能确定有其他的方式(或者其他的静态方法)导致类装载,这时候初始化 instance 显然没有达到 lazy loading 的效果。
private Singleton() {
}
public static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
装饰器模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。
我们通过下面的实例来演示装饰器模式的用法。其中,我们将把一个形状装饰上不同的颜色,同时又不改变形状类。
步骤 1
创建一个接口:
public interface IShape {
public void draw();
}
步骤 2
创建实现接口的实体类。
public class Circle implements IShape {
@Override
public void draw() {
System.out.println("我画了一个圆!!");
}
}
步骤 3
创建实现了IShape 接口的抽象装饰类。
public abstract class ShapeDecorate implements IShape {
private IShape target;
public ShapeDecorate(IShape target) {// 传入被装饰的对象
this.target = target;
}
@Override
public void draw() {
target.draw();
}
}
步骤 4
创建扩展了 ShapeDecorator 类的实体装饰类。
public abstract class CircleDecorate extends ShapeDecorate {
public CircleDecorate(IShape target) {
super(target);
}
@Override
public void draw() {
System.out.println("我是用红色");
super.draw();
}
}