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中用一个回车站: ,除了桌面以外,其他的每个硬盘中都有一个回车站,其他的回车站和其他硬盘的每个回车站都是同一个,也就是所整个操作系统中有且只有一个回车站,各个地方只是引用此实例。

总结:

单态设计模式的核心就是将类的

构造函数私有化,在类的内部产生实例对象,并通过类的静态方法返回类的实例对象。

时间: 2024-12-16 13:56:40

JAVA单态设计模式的相关文章

Java单态设计模式,扫盲贴

class Person { String name; private static final Person p = new Person(); private Person() { name = "张三"; } public static Person getP() { return p; } } public class TestSingleDemo2 { public static void main(String args[]) { Person p = null; p =

Java中单态设计模式

Java中单态设计模式 2011-09-23 16:38:46|  分类: Java |  标签:technology!  |举报|字号 订阅 此博文是转自新浪博客中一名叫做"俊俊的BLOG“用户的一篇博文.感觉此博文确实很不错,所以在此拿出来分享一下!(笔者只是对其所举的代码略做了一些修改) 一概念: 设计模式:设计模式是指经过大量的实践总结和理论化之后的优选的代码结构.编程风格.以及解决问题的思路. 单态设计模式:采取一定的方法保证在整个软件系统中,对某个类只能产生一个对象实例,并且该类只提

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

(转)Java经典设计模式(3):十一种行为型模式(附实例和详解)

原文出处: 小宝鸽 Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:Java经典设计模式之五大创建型模式(附实例和详解).Java经典设计模式之七大结构型模式(附实例和详解). 行为型模式细分为如下11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 接下来对11种行为型模式逐个进行介

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据

Java Web 设计模式之开闭原则

1.开闭原则(OCP) 遵循开闭原则设计出的模块具有两个主要特征: (1)对于扩展是开放的(Open for extension).这意味着模块的行为是可以扩展的.当应用的需求改变时,我们可以对模块进行扩展,使其具有满足那些改变的新行为.也就是说,我们可以改变模块的功能. (2)对于修改是关闭的(Closed for modification).对模块行为进行扩展时,不必改动模块的源代码或者二进制代码.模块的二进制可执行版本,无论是可链接的库.DLL或者.EXE文件,都无需改动. 2.通过UML