Java23个设计模式的简明教程
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的;设计模式使代码编制真正工程化;设计模式是软件工程的基石脉络,如同大厦的结构一样。
(例如房屋的设计稿,我们可以根据以前的设计创建新的房屋设计;或者军事中的孙子兵法,我们可以根据孙子兵法中的各种招式加以使用,以赢得战争的胜利。简言之,设计模式就是已经被前辈们抽象好的一些思想、工具,我们拿来根据自己的需要对其复用就好了)
创建型模式
一,Singleton,单例模式
有些对象只需要一个,比如:配置文件、工具类、线程池、缓存、日志对象等,如果创造出多个实例,就会导致许多问题,如占用过多的资源,结果不一致等。那么,如何保证整个应用中某个实例有且只有一个呢?单例模式!
- 饿汉模式
-
/* * 单例模式Singleton: 饿汉模式实例 */ public class Singleton { //1.将构造方法私有化,不允许外部直接创建对象 private Singleton() { } //2.创建类的唯一实例,使用static关键字,使其变为类的对象 private static Singleton instance = new Singleton(); //3.提供一个用于获取实例的方法,同时要设置为static,类的方法 public static Singleton getInstance() { return instance; } }
之所以称之为饿汉模式,是因为将其构造函数设置为private,通过创建static实例作为唯一实例,所以只要类一加载,该实例就生成了。(有种一个人很饥饿,一有机会马上吃饭的感觉O(∩_∩)O~,so...)
- 懒汉模式
-
/* * 懒汉模式 */ public class Singleton2 { //1. 将构造方法私有化,不允许外部直接创建对象 private Singleton2() { } //2. 声明类的唯一实例(注意并没有实例化) private static Singleton2 instance; //3. 提供一个用于获取实例的方法 public static Singleton2 getInstance() { if(instance == null) instance = new Singleton2(); return instance; } }
之所以称之为懒汉模式,是因为相对于饿汉模式而言的,它不是类一加载就创建对象,而是等到用户使用时才去创建,因此称之为懒汉模式。
- 测试两种方法
-
public class Test { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2 = Singleton.getInstance(); if(s1 == s2) System.out.println("s1 equals s2"); else System.out.println("s1 nonequals s2"); Singleton2 s3 = Singleton2.getInstance(); Singleton2 s4 = Singleton2.getInstance(); if(s3 == s4) System.out.println("s3 equals s4"); else System.out.println("s3 nonequals s4"); } } //output: s1 equals s2 s3 equals s4
- 区别:饿汉模式的特点是加载类时比较慢(需要同时创建对象),但运行时获取对象的速度较快,线程安全;而懒汉模式的特点是加载类时较快,但运行时获取对象的速度较慢,线程不安全
二、Factory, 工厂模式
- 工厂模式的概念
- 实例化对象,用工厂方法代替new操作;
- 工厂模式包括工厂方法模式和抽象工厂模式;
- 抽象工厂模式是工厂方法模式的扩展。
- 工厂模式的意图
- 定义一个接口来创建对象,但是让子类来决定哪些类需要被实例化;
- 工厂方法把实例化的工作推迟到子类中去实现。
- 工厂模式的应用场景
- 有一组类似的对象需要创建;
- 在编码时不能预见需要创建哪种实例。
- 系统需要考虑扩展性,不应依赖于产品实例如何被创建、组合和表达的细节。
- 工厂模式的设计思想
- 尽量松耦合,一个对象的依赖对象的变化与本身无关;
- 具体产品与客户端玻璃,责任分割
- 客户端下命令,creator工厂来创建实例
- 工厂模式的实例:
- myotee脸萌,可以自由选择发行、脸型、眉毛等
- 要做一个类似脸萌的软件,应该怎样构思呢?
- 已发行为例,发型是由这个大产品中的一个小部件,如果制作出了发型,其他部分也都相似。
三、抽象工厂:Abstract Factory
抽象工厂是在工厂模式的基础上增加的一层抽象概念。抽象工厂是一个父类工厂,可以创建其他工厂类。“工厂的工厂”
四、建造者模式:Builder
与工厂模式的区别:当创造一个对象需要很多步骤是适合使用建造者模式。而当只需调用一个方法就可以简单的创建整个对象时适合使用工厂模式。