资讯专栏INFORMATION COLUMN

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

FreeZinG / 1528人阅读

摘要:今天上课的时候老师开始讲个设计模式,为加深印象,特开一篇文章来做记录。其中参考大话设计模式以及上课的例子,后期会补充关于的应用保证一个类仅有一个实例。单例是有状态的,允许子类继承,拥有唯一的对象实例。原始对象与副本引用同一对象。

今天上课的时候老师开始讲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),则逐位复制。若字段是引用类型,只复制引用但不复制引用的对象。原始对象与副本引用同一对象。
深拷贝则是同时复制引用对象。把引用对象的变量指向复制过的新对象。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79315.html

相关文章

  • 设计模式学习笔记)【SingletonAdapterIteratorPrototype

    摘要:今天上课的时候老师开始讲个设计模式,为加深印象,特开一篇文章来做记录。其中参考大话设计模式以及上课的例子,后期会补充关于的应用保证一个类仅有一个实例。单例是有状态的,允许子类继承,拥有唯一的对象实例。原始对象与副本引用同一对象。 今天上课的时候老师开始讲23个设计模式,为加深印象,特开一篇文章来做记录。其中参考《大话设计模式》以及上课的例子(java),后期会补充关于js的应用 ...

    liuchengxu 评论0 收藏0
  • es6学习笔记-Symbol_v1.0_byKL

    摘要:它是语言的第七种数据类型前六种是布尔值字符串数值对象。为了防止冲突这就是引入的原因。指向了这个内部方法调用了返回对象的属性等于一个布尔值,表示该对象使用时,是否可以展开。数组的默认行为是可以展开返回对象的属性,指向当前对象的构造函数。 es6学习笔记-Symbol_v1.0 基本抄了一次内容,有很多只是知道其然并不知其所以然,不过也算是加深了一次印象,另外每段代码我都有手动执行过. E...

    Lowky 评论0 收藏0
  • FE.BASE-前端设计模式、编码与重构笔记

    摘要:高质量特性面向对象,无类,原型可维护的代码可读一致可预测看起来像是同一个人写的文档减少全局对象,传参访问全局对象单模式,忘记时的副作用显式声明的全局变量无法用删除不扩充内置原型模式每个和对齐这里不考虑花括号相关的缩进规则每个中的代码整齐缩进 高质量Javascript Javascript特性:面向对象,无类,原型 可维护的代码(可读;一致;可预测;看起来像是同一个人写的;文档) 减...

    SmallBoyO 评论0 收藏0
  • PHP 设计模式概述

    摘要:创建型模式主要有以下五种简单工厂模式和工厂方法模式抽象工厂模式单例模式建造者模式原型模式在设计模式一书中将工厂模式分为两类工厂方法模式与抽象工厂模式。 一、 设计模式(Design pattern)是什么 设计模式是一套被反复使用、多数人知晓、经过分类编目的代码设计的经验总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 二、 为什么会有设计模式 在软件开发过...

    IntMain 评论0 收藏0
  • PHP基础

    摘要:分别为适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。设计模式五适配器模式适配器模式将某个对象的接生成器和协程的实现在这篇文章中,作者针对那些比较难以理解的概念,以一个更为通俗的方式去讲明白。。 PHP 源码注解 PHP 的详细源码注解 PHP 字符串操作整理 一些有关字符串的常用操作。 Redis 常见七种使用场景 (PHP 实战) 这篇文章主要介绍利用 R...

    HtmlCssJs 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<