设计模式(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

  与工厂模式的区别:当创造一个对象需要很多步骤是适合使用建造者模式。而当只需调用一个方法就可以简单的创建整个对象时适合使用工厂模式。

Java23个设计模式的简明教程的更多相关文章

  1. appium简明教程

    appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...

  2. Python 简明教程 --- 18,Python 面向对象

    微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码能借用就借用. -- Tom Duff 目录 编程可分为面向过程编程和面向对象编程,它们是两种不 ...

  3. java23种设计模式—— 一、设计模式介绍

    Java23种设计模式全解析 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模 ...

  4. java23种设计模式——五、建造者模式

    源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...

  5. 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)

    小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...

  6. 2013 duilib入门简明教程 -- 部分bug (11)

     一.WindowImplBase的bug     在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题,     1.最大化按钮的样式 ...

  7. 2013 duilib入门简明教程 -- 部分bug 2 (14)

        上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃            如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...

  8. 2013 duilib入门简明教程 -- 自绘控件 (15)

        在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...

  9. 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)

        界面的显示方面就都讲完啦,下面来介绍下控件的响应.     前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...

随机推荐

  1. PHP生成一个六位数的邀请码

    PHP生成一个六位数的邀请码 $unique_no = substr(base_convert(md5(uniqid(md5(microtime(true)),true)), 16, 10), 0, ...

  2. nginx2goaccess.sh脚本内容

    脚本github地址:https://github.com/stockrt/nginx2goaccess/blob/master/nginx2goaccess.sh 脚本内容: #!/bin/bash ...

  3. Learning Experience of Big Data: Learn to install CentOs 6.5 on my laptop

    I have learnt some experience about Big Data during my summer vocation,I was told that The first thi ...

  4. 对URI的理解

    在了解RESTful api的设计规范的时候,遇到了一个问题,就是uri和url有什关系,有什么区别,所以就在这里记录一下. URI(Uniform Resource Identifier),统一资源 ...

  5. R语言学习笔记(二十):stringr包中函数介绍(表格)

    stringr包中的重要函数 函数 功能说明 R Base中对应函数 使用正则表达式的函数 str_extract() 提取首个匹配模式的字符 regmatches() str_extract_all ...

  6. Tensorflow之MNIST的最佳实践思路总结

    Tensorflow之MNIST的最佳实践思路总结   在上两篇文章中已经总结出了深层神经网络常用方法和Tensorflow的最佳实践所需要的知识点,如果对这些基础不熟悉,可以返回去看一下.在< ...

  7. 20145202马超 2006-2007-2 《Java程序设计》第3周学习总结

    20145202马超 2016-2017-2 <Java程序设计>第3周学习总结 教材学习内容总结 函数的重载:在同一个类中,允许存在一个以上的同名函数,只要他们的参数数目不同就可以.与返 ...

  8. itop-4412开发板使用第一篇-信号量的学习使用

    1. 本次基于itop-4412研究下Linux信号量的使用方法. 2. 创建信号量的函数,信号量的头文件在那个路径?编译应用程序的话,头文件有3个路径,内核源码头文件,交叉编译器头文件,ubuntu ...

  9. Python连接符的种类和使用区别

    python的连接符主要有 加号(+).逗号(,).空格(   ) .反斜线(\).join()的方式. 加号(+),demo如下: #注意,+只能连接字符串,如果一个是字符串一个是数字就会报错 pr ...

  10. mysql8.0.14 安装

    1.下载 地址:https://dev.mysql.com/downloads/mysql/ 找到zip压缩文件. 2.配置环境变量 把解压后的路径配置到环境变量中 3.安装 在解压后的文件夹中新建m ...