设计模式(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. 路由器基础设置之ospf

    我们将以上面的拓扑图来进行实验,要用ospf的协议达到全网互通的效果 router1: enable 进入特权模式 config t 进入全局配置模式 interface L0 ip address ...

  2. thinkphp5 分页带参数的解决办法

    文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member') ->where('member_name|member_mobile|se ...

  3. 浅谈Linux下mv和cp命令的区别

    1.功能上的区别 mv:用户可以使用该命令为文件或目录重命名或将文件由一个目录移入另一个目录中. cp: 该命令的功能是将给出的文件或目录拷贝到另一文件或目录中. 2.从inode角度来区分 mv:会 ...

  4. php访问url(get和post请求)

    get请求 /* * php访问url路径,get请求 */ function curl_file_get_contents($durl){ // header传送格式 $headers = arra ...

  5. python之三元运算

    三元运算(三目运算):用于较简单的判断(if   else). if True: return s = "aaaa" else: return s = "bbbb&quo ...

  6. C语言实例解析精粹学习笔记——33(扑克牌的结构表示)

    实例33: 使用“结构”定义一副扑克牌,并对变量赋值,输出结果 思路: 扑克牌有4种花色,用枚举类型表示花色,其他都是结构体的简单应用 程序代码: #include <stdio.h> # ...

  7. css在线sprite

    大家知道网站图片多,浏览器下载多个图片要有多个请求.可是请求比较耗时,那怎么办呢? 对,方法就是css sprite. 今天我们来看看css在线sprite 百度搜索css-sprite 打开www. ...

  8. 使用maven插件生成grpc所需要的Java代码

    1.首先需要编写自己需要的.proto文件,本文重点不在这里,.proto可以参考grpc官方例子 https://grpc.io/docs/quickstart/java.html 2.创建自己的J ...

  9. spring读取properties和其他配置文件的几种方式

    1.因为spring容器的一些机制,在读取配置文件进行数据库的配置等等是很有必要的,所以我们要考虑配置文件的的读取方式以及各个方式的实用性 2.配置文件的读取方式我这里介绍2种,目的是掌握这2种就可以 ...

  10. html简单的分享功能

    超级简单的分享. 包括:QQ.QQ空间.新浪微博.腾讯微博,微信(只是一个二维码): 1.首先是html代码: (前端我并不太会,一直用的都是bootstrap) <div class=&quo ...