今天上课的时候老师开始讲23个设计模式,为加深印象,特开一篇文章来做记录。
其中参考《大话设计模式》以及上课的例子(java),后期会补充关于js的应用
-
Singleton 保证一个类仅有一个实例。让类自身负责保存它的唯一实例。
(使用场景:绘图程序中的工具箱,无需每次点击按钮都重新创建一个工具箱对象)
单例模式与实用类(例如Math)的区别:实用类不保存状态,仅提供静态方法或静态属性来使用,并且不能用于集成多态。单例是有状态的,允许子类继承,拥有唯一的对象实例。/*Singleton.java*/ public class Singleton { private static Singleton singleton = new Singleton(); private Singleton() { } public static Singleton getInstance() { return singleton; } } /*Main.java*/ public class Main { public static void main(String[] args) { System.out.println("Start."); Singleton obj1 = Singleton.getInstance(); Singleton obj2 = Singleton.getInstance(); System.out.println("End."); } }
需要注意的是,静态方法需要添加互斥
-
Adapter 将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作
(生活场景:姚明去NBA打球时不会英语,需要翻译来与教练、球员沟通)
(使用场景:在双方都不太容易修改的时候,可以使用。应用于希望复用一些现存的类,但接口不兼容的情况) -
Iterator 提供一种方法顺序访问一个聚合对象中各个元素,又不暴露该对象的内部表示
(生活场景:售票员依次对车上所有人售票)
(使用场景:需要对聚集有多种方式遍历时。【但.Net和JAVA中其实都已提供相关接口】)/*Iterator.java*/ public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); } /*BookShelfIterator.java*/ public class BookShelfIterator implements Iterator { private BookShelf bookShelf; private int index; public BookShelfIterator(BookShelf bookShelf) { this.bookShelf = bookShelf; this.index = 0; } public boolean hasNext() { if (index < bookShelf.getLength()) { return true; } else { return false; } } public Object next() { Book book = bookShelf.getBookAt(index); index++; return book; } }
为什么不直接使用BookShelfIterator,而需要继承Iterator迭代器呢?因为不同的聚合对象有不同的高效的访问方式,例如数组可以直接返回下标,但对于链表、树而言显然需要另外一种方式。
-
Prototype 用原型实例制定创建对象的种类,并通过拷贝这些原型来创建新对象
(生活场景:简历的复印。如果需要三份简历需要实例化简历三次,这时也使用原型模式)
原型模式就是从一个对象再创建另外一个可定制的对象,并且不需要知道任何创建的细节。等于不同重新初始化对象,而是动态获得对象运行时的状态。大大提高了性能。
【ps:浅拷贝与深拷贝】
浅拷贝:如果字段是值类型(例如int,float),则逐位复制。若字段是引用类型,只复制引用但不复制引用的对象。原始对象与副本引用同一对象。
深拷贝则是同时复制引用对象。把引用对象的变量指向复制过的新对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。