设计模式学习笔记(一)【Singleton、Adapter、Iterator 、Prototype 】

今天上课的时候老师开始讲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打球时不会英语,需要翻译来与教练、球员沟通)
    (使用场景:在双方都不太容易修改的时候,可以使用。应用于希望复用一些现存的类,但接口不兼容的情况)

    《设计模式学习笔记(一)【Singleton、Adapter、Iterator 、Prototype 】》

  • 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 用原型实例制定创建对象的种类,并通过拷贝这些原型来创建新对象

    (生活场景:简历的复印。如果需要三份简历需要实例化简历三次,这时也使用原型模式)
    原型模式就是从一个对象再创建另外一个可定制的对象,并且不需要知道任何创建的细节。等于不同重新初始化对象,而是动态获得对象运行时的状态。大大提高了性能。
    《设计模式学习笔记(一)【Singleton、Adapter、Iterator 、Prototype 】》

【ps:浅拷贝与深拷贝】
浅拷贝:如果字段是值类型(例如int,float),则逐位复制。若字段是引用类型,只复制引用但不复制引用的对象。原始对象与副本引用同一对象。
深拷贝则是同时复制引用对象。把引用对象的变量指向复制过的新对象。
    原文作者:设计模式
    原文地址: https://segmentfault.com/a/1190000005013524
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞