Java---设计模块(设计模块的简介及最简单的俩个单例代码加测试)
设计模式学习概述:
★ 为什么要学习设计模式
1、设计模式都是一些相对优秀的解决方案,很多问题都是典型的、有代表性的问题,学习设计模式,我们就不用自己从头来解决这些问题,相当于在巨人的肩膀上,复用这些方案即可。
2、设计模式已经成为专业人士的常用词汇,不懂不利于交流。
3、能让你设计的系统更加专业,让系统有更好的架构。
★ 学习设计模式的层次
1、基本入门级——套用型(半年到一年左右时间领悟学会)
2、基本掌握级——可变形使用型(一年左右时间领悟学会)
3、真正理解和掌握级——思想上吸收和趋同型(看个人天赋,不确定时间学会)
设计模式1——单例
解决:保证了一个类在内存中只能有一个对象。
思路:
1、如果其他程序能够随意用new创建该类对象,那么就无法控制个数。因此,不让其他程序用new创建该类的对象。
2、既然不让其他程序new该类对象,那么该类在自己内部就要创建一个对象,否则该类就永远无法创建对象了。
3、该类将创建的对象对外(整个系统)提供,让其他程序获取并使用。
步骤:
1、 将该类中的构造函数私有化。
2、在本类中创建一个本类对象。
3、定义一个方法,返回值类型是本类类型。让其他程序通过该方法就可以获取到该类对象。
第一种方法:
package cn.hncu.pattern.singleton.one;
/*
* 饿汉式
*/
public class Single {
private static final Single S = new Single();
private Single(){
}
public static Single getInstance(){
return S;
}
}
测试的类:
package cn.hncu.pattern.singleton.one;
public class TestSingle {
public static void main(String[] args) {
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
System.out.println(Single.getInstance());
Single s1 = Single.getInstance();
Single s2 = Single.getInstance();
//测试地址值是否相等
System.out.println(s1==s2);
}
}
测试结果:
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
cn.hncu.pattern.singleton.one.Single@bcda2d
true
第二种方法:
package cn.hncu.pattern.singleton.two;
/*
* 懒汉式
*/
public class Single {
private static Single s = null;
private Single(){
}
//单例的延迟加载方式,有一个小bug,就是多线程加载时,会出现多次new的情况
//下面给出解决这个延迟的问题。
// public static Single getInstance(){
// if(s==null){
// s = new Single();
// }
// return s;
// }
//优化方案---多线程加锁,谁调用锁谁,每次只能让一个线程调用
public static synchronized Single getInstance(){
if(s==null){
s = new Single();
}
return s;
}
}
测试的类:
package cn.hncu.pattern.singleton.two;
public class TestSingle2 {
public static void main(String[] args) {
Thread[] td = new Thread[50];
//给一个线程数组
for(int i=0;i<td.length;i++){
td[i] = new useSingle();
}//new出每一个线程
for(int i=0;i<td.length;i++){
td[i].start();
}
}
}
class useSingle extends Thread {
@Override
public void run() {
Single obj = Single.getInstance();
System.out.println(obj);
}
}
测试结果:
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
cn.hncu.pattern.singleton.two.Single@2af081
Java---设计模块(设计模块的简介及最简单的俩个单例代码加测试)的更多相关文章
- 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类
static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...
- 《Effective Java》 读书笔记(三) 使用私有构造方法或枚举实现单例类
1.单例类到现在为止算是比较熟悉的一种设计模式了,最开始写单例模式是在C#里面,想要自己实现一个单例类,代码如下: public class Instance { private static rea ...
- Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】
static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...
- Java并发-懒汉式单例设计模式加volatile的原因
懒汉式单例的double check.例一: class SingletonClass{ private static SingletonClass instance = null; private ...
- 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)
算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...
- 如何写出面试官欣赏的Java单例
单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 今天我们不谈单例模式的用途,只说一说如果在面试的时候面试官让你敲一段代码 ...
- 写一个安全的Java单例
单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...
- Java开源生鲜电商平台-通知模块设计与架构(源码可下载)
Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式: 1. 消息推送:(采用极光推送) ...
- Java开源生鲜电商平台-团购模块设计与架构(源码可下载)
Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...
随机推荐
- 【基础练习】【vector】codevs3393 序列倒置
版权信息 转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看 题目非常easy,本质还是练习一下vector 题目描写叙述 Descriptio ...
- yiiwheels.widgets.datetimepicker.WhDateTimePicker language
参考 https://github.com/2amigos/yiiwheels/blob/master/widgets/datetimepicker/WhDateTimePicker.php publ ...
- android的task任务栈
转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...
- hdu 2111
#include <iostream> #include <algorithm> using namespace std; struct money { int s; int ...
- hdu 1022
// hdu1022 这题算是我做的第一道栈的题目,之前看过栈的一些内容,做这道题的时候,可以模拟出过程,但是具体的代码不会写...所以决定练习一些栈和队列的问题,大概思路就是有三个数组和一个栈,先把 ...
- Xml序列化自引用/循环引用问题2
1.类定义: public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgn ...
- redis例子
http://www.cnblogs.com/edisonfeng/p/3571870.html
- swing菜单,常用组件,常用容器
1菜单 import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event ...
- hdu 2480 贪心+简单并查集
Steal the Treasure Time Limit: 10000/6000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- Yum 安装 zabbix...
环境:centos6_64 Mysql环境.禁用iptable selinux 安装基础包: 需要安装LAMP.自己安装吧...不会的请移步...LAMP rpm -ivh http://repo.z ...