JAVA单态设计模式
核心--在类的内部把构造器私有化,同时在内部产生对象,并通过类.静态方法(static)返回实例化对象的引用
设计模式是在大量的实践总结和理论化之后优选的代码结果,编程风格,以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋局我们用不同的棋谱.
单态设计模式:采取一定的方法保证在整个软件系统中,对某个类只能产生一个对象实例,并且该类只提供一个取得其对象的实例方法.
在java中实现单态模式只需要执行以下三步:
1.将类的构造方法的访问权限声明为private.这样就不能用new操作符在类的外部产生类的对象了,但在类内部仍可以产生该类的对象.
2.在类内部生成一个静态的实例.
3.提供一个静态的方法用于外部取得该类的实例.
因为在类的外部无法得到类的对象,所以只能调用该类的某个静态方法以返回类内部创建的对象,又因为静态方法只能访问类中的静态成员变量,所以,指向类内部产生该类对象的变量也必须定义成静态的.
class Chinese{
static Chinese objRef = new Chinese();
private Chinese(){}
public static Chinese getInstance(){
return objRef;
}
}
class Chinese_opt{
static Chinese_opt objRef = null;
private Chinese_opt(){}
public static Chinese_opt getInstance(){
if(objRef == null)
objRef = new Chinese_opt();
return objRef;
}
}
class TestChinese{
public static void main(String[] args){
Chinese chinese1 = Chinese.getInstance();
Chinese chinese2 = Chinese.getInstance();
System.out.println(chinese1 == chinese2);
}
}
1:构造方法私有化:
面向对象编程的三大特性:封装、继承、多态。类的封装性不仅体现在对属性的封装上,实际上方法也是可以被封装的,构造方法是特殊的方法当然也可以被封装,例如下面的代码就是对构造方法的封装:
package com.zxf.javaopp;
public class Singleton {
private Singleton(){ // 将构造方法进行了封装,私有化
}
public void print(){
System.out.println("Hello World!!!") ;
}
}
构造函数被私有化,不能在外部实例化,就无法在外部使用,此时只能在该类的内部实例化对象了,然后将该类拿到外部进行使用,由于该类不能再外部实例化,此时在内部的实例化必须是用static关键字修饰的:代码如下:
package com.zxf.javaopp;
class Singleton1{
static Singleton1 instance = new Singleton1() ; // 在内部产生本类的实例化对象
private Singleton1(){ // 将构造方法进行了封装,私有化
}
public void print(){
System.out.println("Hello World!!!") ;
}
}
public class SingletonDemo01{
public static void main(String args[]){
Singleton1 s1 = null ; // 声明对象
s1 = Singleton1.instance ; // 取得实例化对象
s1.print() ; // 调用方法
}
}
虽然上面的代码实现了功能,但又有些问题:通常情况下:我们将属性封装,此时的代码就要修改如下:
package com.zxf.javaopp;
class Singleton1{
static Singleton1 instance = new Singleton1() ; // 在内部产生本类的实例化对象
public static Singleton1 getInstance(){ // 通过静态方法取得instance对象
return instance ;
}
private Singleton1(){ // 将构造方法进行了封装,私有化
}
public void print(){
System.out.println("Hello World!!!") ;
}
}
public class SingletonDemo01{
public static void main(String args[]){
Singleton1 s1 = null ; // 声明对象
s1 = Singleton1.getInstance() ; // 取得实例化对象
s1.print() ; // 调用方法
}
}
以上的代码似乎变得很复杂,不如不将构造方法实例化呢,但是为什么又会这样做呢?
假如我们现在要产生几个对象:按以往的代码,就需要实例化多次,每个对象都有其对应的堆栈空间,此时的内存就消耗的很多,系统的效率坑定比较低,但是使用将构造方法封装的模式效率就比较高:
使用将构造方法封装的方法:无论产生多少个对象,我们只实例化一次,这样的设计在设计模式上称为单态设计模式(单例设计模式):
singleton,如果不希望一个类产生多个实例的话,则必须使用单态设计模式,此设计模式,在以后的高性能开发中经常使用,而且在java的类库中大量的使用了此设计模式。
所谓单态就是在入口处限制了对象的实例操作。
单态设计模式的意义:
实际上这种模式非常常用,我们大家使用的windows操作系统中就使用了此设计模式,windows中用一个回车站: ,除了桌面以外,其他的每个硬盘中都有一个回车站,其他的回车站和其他硬盘的每个回车站都是同一个,也就是所整个操作系统中有且只有一个回车站,各个地方只是引用此实例。
总结:
单态设计模式的核心就是将类的
构造函数私有化,在类的内部产生实例对象,并通过类的静态方法返回类的实例对象。
JAVA单态设计模式的更多相关文章
- Java中单态设计模式
Java中单态设计模式 2011-09-23 16:38:46| 分类: Java | 标签:technology! |举报|字号 订阅 此博文是转自新浪博客中一名叫做"俊俊的 ...
- 基于java的设计模式入门(1)——为什么要学习设计模式
大年初一,楼主在这里给大家拜年,祝大家码上升职加薪,码上有对象结婚,码上有车有房,幸福安康. 过完年,回学校注册报道之后,大概就要回深圳到公司开始实习了.提高自己,无非就有两种方式,一是看书学习,二是 ...
- php 单态设计模式
单态设计模式通常包含以下三点: · 一个私有的 构造方法:(确保用户无法通过创建对象对其进行实例化) · 一个公有的 静态的 方法:(负责对其本身进行实例化) · 一个私有的 静态的 属性:(用于保存 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- PHP 单态设计模式复习
单态设计模式,也可以叫做单例设计模式, 就是一个类只能让它生成一个对象,避免重复的NEW,影响运行效率(每NEW一个对象都会在内存中开辟一块空间) 示例代码 <?php /* * 单态设计模式 ...
- 单例模式——Java EE设计模式解析与应用
单例模式 目录: 一.何为单例 二.使用Java EE实现单例模式 三.使用场景 一.何为单例 确保一个类只有一个实例,并且提供了实例的一个全局访问点 1.1 单例模式类图 ...
- Java IO设计模式(装饰模式与适配器模式)
01. 装饰模式 1. 定义 Decorator装饰器,就是动态地给一个对象添加一些额外的职责,动态扩展,和下面继承(静态扩展)的比较.因此,装饰器模式具有如下的特征: 它必须持有一个被装饰的对象(作 ...
- java多线程设计模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...
- Java经典设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之 ...
随机推荐
- 「PHP」设计模式介绍
引言 最近再看PHP设计模式相关的一些技术文章,网上有关PHP的设计模式范例很少,这里做一些总结仅供参考,不足之处望提出. 参考资料: <大话设计模式>程杰 什么是设计模式 设 ...
- 【Storm一】Storm安装部署
storm安装部署 解压storm安装包 $ tar -zxvf apache-storm-1.1.0.tar.gz -C /usr/local/src 修改解压后的apache-storm-1.1. ...
- 如何判断一个 APP页面是否是H5页面(转载)
1.无网络断开网络,显示404或则错误页面的是H5 2.页面布局a.在手机设置.开发者选项中开启显示布局边界功能:b.进入应用查看布局边界:c.原生应用可以看到各个控件的布局边界,H5只有整个页面的一 ...
- 7、Linux应用程序地址布局
程序构成 在学习Linux应用程序开发时,经常会遇到如下概念: 代码段.数据段.BSS段(Block Started by Symbol,又名:未始化数据段) .堆(heap)和栈(stack).始化 ...
- python基础 抽象类(接口类)
Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...
- Django中ORM简述
ORM:对象关系映射(Object Relational Mapping,简称ORM) 作用:根据类生成表结构,将对象.列表的操作转换成对象的SQL语句,将SQL语句查询的结果转换为对象或列表 优点: ...
- mongoengine中queryset触发网络访问机制剖析
背景 最近新上线的一个服务,偶尔会有超时告警,其主要逻辑仅仅只是简单的读/写mongodb,而且服务上线初期,流量并不大,因而理论上来说,每次请求都应该很快才对,事实上分析日志也证实90%以上的请求都 ...
- 天津Uber优步司机奖励政策(12月21日到12月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- SpringBoot-01:什么是SpringBoot?
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- SpringBoot: Spring Boot可以轻松创建独立的,生产级的基于Spring的应用程序,您可以“ ...
- IAR调试cc2541串口遇到的Warning : Possible IDATA stack overflow detected
1. 遇到的错误如下,似乎是栈空间不够使用 2. 修改界面如下,增加IDATA的大小,不过最大似乎是0XFF.