设计模式学习概述:

★ 为什么要学习设计模式

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---设计模块(设计模块的简介及最简单的俩个单例代码加测试)的更多相关文章

  1. 0013 Java学习笔记-面向对象-static、静态变量、静态方法、静态块、单例类

    static可以修饰哪些成员 成员变量---可以修饰 构造方法---不可以 方法---可以修饰 初始化块---可以修饰 内部类(包括接口.枚举)---可以修饰 总的来说:静态成员不能访问非静态成员 静 ...

  2. 《Effective Java》 读书笔记(三) 使用私有构造方法或枚举实现单例类

    1.单例类到现在为止算是比较熟悉的一种设计模式了,最开始写单例模式是在C#里面,想要自己实现一个单例类,代码如下: public class Instance { private static rea ...

  3. Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】

    static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...

  4. Java并发-懒汉式单例设计模式加volatile的原因

    懒汉式单例的double check.例一: class SingletonClass{ private static SingletonClass instance = null; private ...

  5. 算法、数据结构、与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design)

    算法.数据结构.与设计模式等在游戏开发中的运用 (一):单例设计(Singleton Design) 作者: Compasslg 李涵威 1. 什么是单例设计(Singleton Design) 在学 ...

  6. 如何写出面试官欣赏的Java单例

    单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例. 今天我们不谈单例模式的用途,只说一说如果在面试的时候面试官让你敲一段代码 ...

  7. 写一个安全的Java单例

    单例模式可能是我们平常工作中最常用的一种设计模式了.单例模式解决的问题也很常见,即如何创建一个唯一的对象.但想安全的创建它其实并不容易,还需要一些思考和对JVM的了解. 1.首先,课本上告诉我,单例这 ...

  8. Java开源生鲜电商平台-通知模块设计与架构(源码可下载)

    Java开源生鲜电商平台-通知模块设计与架构(源码可下载) 说明:对于一个生鲜的B2B平台而言,通知对于我们实际的运营而言来讲分为三种方式:           1. 消息推送:(采用极光推送)   ...

  9. Java开源生鲜电商平台-团购模块设计与架构(源码可下载)

    Java开源生鲜电商平台-团购模块设计与架构(源码可下载) 说明:任何一个电商系统中,对于促销这块是必不可少的,毕竟这块是最吸引用户的,用户也是最爱的模块之一,理由很简单,便宜. 我的经验是无论是大的 ...

随机推荐

  1. 【基础练习】【vector】codevs3393 序列倒置

    版权信息 转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看 题目非常easy,本质还是练习一下vector 题目描写叙述 Descriptio ...

  2. yiiwheels.widgets.datetimepicker.WhDateTimePicker language

    参考 https://github.com/2amigos/yiiwheels/blob/master/widgets/datetimepicker/WhDateTimePicker.php publ ...

  3. android的task任务栈

    转自http://blog.csdn.net/liuhe688/article/details/6761337 古人學問無遺力,少壯工夫老始成.紙上得來終覺淺,絕知此事要躬行.南宋.陸遊<冬夜讀 ...

  4. hdu 2111

    #include <iostream> #include <algorithm> using namespace std; struct money { int s; int ...

  5. hdu 1022

    // hdu1022 这题算是我做的第一道栈的题目,之前看过栈的一些内容,做这道题的时候,可以模拟出过程,但是具体的代码不会写...所以决定练习一些栈和队列的问题,大概思路就是有三个数组和一个栈,先把 ...

  6. Xml序列化自引用/循环引用问题2

    1.类定义: public class Student { public int ID { get; set; } public string Name { get; set; } //[XmlIgn ...

  7. redis例子

    http://www.cnblogs.com/edisonfeng/p/3571870.html

  8. swing菜单,常用组件,常用容器

    1菜单 import javax.swing.*; import java.awt.*; import java.awt.event.InputEvent; import java.awt.event ...

  9. hdu 2480 贪心+简单并查集

    Steal the Treasure Time Limit: 10000/6000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  10. Yum 安装 zabbix...

    环境:centos6_64 Mysql环境.禁用iptable selinux 安装基础包: 需要安装LAMP.自己安装吧...不会的请移步...LAMP rpm -ivh http://repo.z ...