Java23个设计模式的简明教程
设计模式(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个设计模式的简明教程的更多相关文章
- appium简明教程
appium简明教程 什么是appium? 下面这段介绍来自于appium的官网. Appium is an open-source tool you can use to automate mobi ...
- Python 简明教程 --- 18,Python 面向对象
微信公众号:码农充电站pro 个人主页:https://codeshellme.github.io 代码能借用就借用. -- Tom Duff 目录 编程可分为面向过程编程和面向对象编程,它们是两种不 ...
- java23种设计模式—— 一、设计模式介绍
Java23种设计模式全解析 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式--四.原型模 ...
- java23种设计模式——五、建造者模式
源码在我的github和gitee中获取 目录 java23种设计模式-- 一.设计模式介绍 java23种设计模式-- 二.单例模式 java23种设计模式--三.工厂模式 java23种设计模式- ...
- 2013 duilib入门简明教程 -- 第一个程序 Hello World(3)
小伙伴们有点迫不及待了么,来看一看Hello World吧: 新建一个空的win32项目,新建一个main.cpp文件,将以下代码复制进去: #include <windows.h> #i ...
- 2013 duilib入门简明教程 -- 部分bug (11)
一.WindowImplBase的bug 在第8个教程[2013 duilib入门简明教程 -- 完整的自绘标题栏(8)]中,可以发现窗口最大化之后有两个问题, 1.最大化按钮的样式 ...
- 2013 duilib入门简明教程 -- 部分bug 2 (14)
上一个教程中提到了ActiveX的Bug,即如果主窗口直接用变量生成,则关闭窗口时会产生崩溃 如果用new的方式生成,则不会崩溃,所以给出一个临时的快速解决方案,即主窗口 ...
- 2013 duilib入门简明教程 -- 自绘控件 (15)
在[2013 duilib入门简明教程 -- 复杂控件介绍 (13)]中虽然介绍了界面设计器上的所有控件,但是还有一些控件并没有被放到界面设计器上,还有一些常用控件duilib并没有提供(比如 ...
- 2013 duilib入门简明教程 -- 事件处理和消息响应 (17)
界面的显示方面就都讲完啦,下面来介绍下控件的响应. 前面的教程只讲了按钮和Tab的响应,即在Notify函数里处理.其实duilib还提供了另外一种响应的方法,即消息映射DUI_BEG ...
随机推荐
- css公共类
/*iOS弹性滚动*/ .scrolling{ position: absolute; width: 100%; height:100%; overflow-x:hidden; overflow-y: ...
- webpack3构建全面提速优化vue-cli
前言 伴随着vue的全球化,各种vue的组件框架越来越完善,从早期的element-ui到vux,iview等越来越多高质量的项目,使用vue进行前端构建已然是一件工程化,模块化,敏捷化的事情 在这其 ...
- SQL命令(二)
(1)数据库查询 格式: SELECT <列名1,2,3...> FROM <表名> [WHERE子句] [GROUP BY 子句] [HAVING 子句] [ORDER BY ...
- HBase学习(三):数据模型
和传统的关系型数据库类似,HBase以表(Table)的方式组织数据.HBase的表由行(Row)和列(Column)共同构成,与关系型数据库不同的是HBase有一个列族(ColumnFamily)的 ...
- Awakening Your Senses【唤醒你的感觉官能】
Awakening Your Senses Give youself a test. Which way is the wind blowing? How many kinds of wildflow ...
- C语言实例解析精粹学习笔记——31
实例31: 判断字符串是否是回文 思路解析: 引入两个指针变量(head和tail),开始时,两指针分别指向字符串的首末字符,当两指针所指字符相等时,两指针分别向后和向前移动一个字符位置,并继续比较, ...
- go学习笔记-类型转换(Type Conversion)
类型转换(Type Conversion) 类型转换用于将一种数据类型的变量转换为另外一种类型的变,基本格式 type_name(expression) type_name 为类型,expressio ...
- dubbo-admin管理控制台安装和使用
现在链接都变成了https://github.com/apache/incubator-dubbo/,找不到dubbo-admin这个目录. 那就直接去下载他们打包好的源代码:https://gith ...
- xss挑战赛小记 0x02(prompt(1))
0x0O 上次搜xss挑战赛的时候 还找到了一个看上去难度更高的挑战赛 今天做了一下 学到了很多新东西 这个挑战赛能够在页面成功prompt(1)就算过关了 挑战地址 http://prompt.ml ...
- A problem occurred evaluating project ':'. > ASCII
项目编译出错: 错误信息如下: FAILURE: Build failed with an exception. * Where: Build file 'F:\git\i***\build.grad ...