设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。
根据设计模式的参考书 Design Patterns - Elements of Reusable Object-Oriented Software(中文译名:设计模式 - 可复用的面向对象软件元素) 中所提到的,总共有 23 种设计模式。23种设计模式分为三类:创建型模式、结构型模式和行为型模式。
创建型模式:单例模式、抽象工厂模式、建造者模式、工厂模式、原型模式。
结构型模式:适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。
行为型模式:模版方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式(责任链模式)、访问者模式。
1. 单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例。
只需要三步就可以实现单例模式
(1) 不允许其他程序用new对象 - 私有化该类的构造函数
(2) 在该类中创建对象 - 通过new在本类中创建一个本类对象
(3) 对外提供一个可以让其他程序获取该对象的方法 - 定义一个公有的方法,将在该类中所创建的对象返回
其中实现单例模式有两种方式:饿汉式和懒汉式。
饿汉式的实现比较简单,在类加载的时候就完成了实例化,避免了线程的同步问题。由于在类加载的时候就实例化了,所以没有达到Lazy Loading(懒加载)的效果,也就是说可能我没有用到这个实例,但是它也会加载,会造成内存的浪费(一般此浪费可以忽略,所以推荐使用此方式)。
package angelia.pattern.singleton;
public class EHanSingleton {
private EHanSingleton() {}
private static EHanSingleton eHanSingleton = new EHanSingleton();
public static EHanSingleton getInstance() {
if (eHanSingleton == null) {
eHanSingleton = new EHanSingleton();
}
return eHanSingleton;
}
}
懒汉式达到Lazy Loading(懒加载)的效果。
package angelia.pattern.singleton;
public class LanHanSingleton {
private static LanHanSingleton lanHanSingleton;
private LanHanSingleton() {}
public static LanHanSingleton getLanHanSingleton() {
if (lanHanSingleton == null) {
synchronized (LanHanSingleton.class) {
if (lanHanSingleton == null) {
lanHanSingleton = new LanHanSingleton();
}
}
}
return lanHanSingleton;
}
}
内部类实现懒汉式,这种方式跟饿汉式方式采用的机制类似,但又有不同。比如都是采用了类装载的机制来保证初始化实例时只有一个线程。不同的是,饿汉式方式是只要Singleton类被装载就会实例化, 内部类是在需要实例化时,调用getInstance方法,才会装载SingletonInnerClass类。这样即避免了线程不安全,延迟加载,效率又高。
package angelia.pattern.singleton;
public class LanHanSingletonIC {
private LanHanSingletonIC() {}
private static class SingletonInnerClass {
private static LanHanSingletonIC lanHanSingletonIC = new LanHanSingletonIC();
}
public static LanHanSingletonIC getInstance() {
return SingletonInnerClass.lanHanSingletonIC;
}
}
2. 工厂模式
工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式又分为:简单工厂模式、工厂方法模式和抽象工厂模式。
简单工厂模式,通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
本媛是个吃货,做梦都想有一个自己的饭店,每天码完代码都能喝到一种鲜美的排骨汤。
首先我要有各种口味的排骨汤:
package angelia.pattern.factory;
public abstract class PaiGuTang {
protected String name;
public void prepare() {
System.out.println("准备各种食材。。。");
}
public void cooking() {
System.out.println("开始做" + this.name);
}
}
public class DongGuaPaiGuTang extends PaiGuTang {
public DongGuaPaiGuTang() {
this.name = "冬瓜排骨汤";
}
}
public class LuoBoPaiGuTang extends PaiGuTang {
public LuoBoPaiGuTang() {
this.name = "萝卜排骨汤";
}
}
public class YuMiPaiGuTang extends PaiGuTang {
public YuMiPaiGuTang() {
this.name = "玉米排骨汤";
}
}
使用简单工厂之前的排骨汤店
public class PaiGuTangOldStore {
public PaiGuTang sellPaiGuTan