`
wangmored
  • 浏览: 164913 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Singleton mode

    博客分类:
  • java
阅读更多
单例模式::保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来 代表那些本质上具有唯一性的系统组件。

单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。     
那么怎么来实现单例模式呢?

一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,就要将构造函数变为私有的(至少是受保护的),使得外面的 类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。(只有一个实例对象叫单实例了)

单例模式可分为有状态的和无状态的。
有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。

饿汉式:
public class DumpDemo {
    private static DumpDemo instance = new DumpDemo();
    private DumpDemo() {}
    //静态工厂方法,提供一个供外部访问得到对象的静态方法
    public static DumpDemo getInstance() {
        return instance;
    }
}

懒汉式:
public class DumpDemo {
    private static DumpDemo instance = null;
    private DumpDemo() {}
    //静态工厂方法,提供一个供外部访问得到对象的静态方法
    public static synchronized DumpDemo getInstance() {
        if (instance == null) {
            instance = new DumpDemo();
        }
        return instance;
    }
}


在第二种方式中,对静态工厂方法进行了同步处理,原因很明显——为了防止多线程环境中产生多个实例;而在第一种方式中则不存在这种情况。(防止多线程过来的破坏)
在第二种方式中将类对自己的实例化延迟到第一次被引用的时候。而在第一种方式中则是在类被加载的时候实例化,这样多次加载会照成多次实例化。但是第二种方式由于使用了同步处理,在反应速度上要比第一种慢一些。
以上两种实现方式均失去了多态性,不允许被继承。还有另外一种灵活点的实现,将构造函数设置为受保护的,这样允许被继承产生子类。
import java.util.HashMap;
public class DumpDemo {
    private static HashMap sinRegistry = new HashMap();
    private static DumpDemo s = new DumpDemo();
    protected DumpDemo() {}
    //静态工厂方法,提供一个供外部访问得到对象的静态方法
    public static DumpDemo getInstance(String name) {
        if(name == null)
            name = "Singleton";
        if(sinRegistry.get(name)==null){
            try{
                   sinRegistry.put(name , Class.forName(name).newInstance());
            }catch(Exception e)
            {
                   e.printStackTrace();
            }    
        }
        return (DumpDemo)(sinRegistry.get(name)); 
    }
    public void test()
     {
      System.out.println("getclasssuccess!");     
     }
}
class SingletonChild1 extends DumpDemo{
       public SingletonChild1(){}       
       static    public SingletonChild1 getInstance()       {     
             //子类中可以获取到一个实例
              return (SingletonChild1)DumpDemo.getInstance("SingletonChild1");    
       }       
       public void test()
       {        System.out.println("getclasssuccess111!");
       }
}
分享到:
评论

相关推荐

    java_design_mode.rar_mode.c

    - 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 - 原型模式(Prototype):通过复制已有对象来创建新对象。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定...

    Java-design-mode.zip_site:www.pudn.com

    创建型模式如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)等,主要关注对象的创建过程,使得对象的创建过程更加灵活,易于控制。结构型模式如适配器模式(Adapter)、装饰器模式...

    design mode

    标题“design mode”暗示我们将讨论的是设计模式的基本概念及其在Java中的应用。设计模式通常分为三大类:创建型、结构型和行为型模式。 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个...

    design-mode:设计模式

    - 单例模式(Singleton):保证一个类仅有一个实例,并提供一个全局访问点。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):...

    单例模式demo

    在Android Studio中,我们可以创建一个名为`SingleMode`的Java文件来实现这个饿汉式单例模式的示例。在这个文件中,我们可以定义一个名为`SingletonClass`的类,按照上面的代码结构进行编写。然后在需要使用这个单例...

    javascript-packages

    托管Javscript程序包 基于Lerna的npm软件包的Mono-repo。 配套 工厂工厂 (还没有) ...# Run the tests in watch mode $ npm run test-watch --testMatch ./packages/ < packagename> / ** / * .test.js

    java-design-mode.rar_Java编程_Java_

    创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory)和建造者模式(Builder)。结构型模式处理对象组合和继承,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。行为型...

    NET面试题大全,包括微软、华为、中兴等大企业的面试真题.doc

    6. **激活模式(Activation Mode)**:WellKnownObjectMode枚举定义了对象的生命周期。在示例中,Singleton模式表示无论多少个客户端请求,服务器端都只会创建一个RmObj实例。 总的来说,.NET Remoting是一个强大的...

    Android中使用SharedPeferences存储

    通常情况下,更推荐使用Intent或Parcelable来传递数据,或者使用Singleton、ViewModel等设计模式来实现全局数据共享。 总结起来,Android中的Shared Preferences是一种简单实用的存储方式,适用于存储小量数据。在...

    <HarmonyOS第一课>应用程序框架-闯关习题及答案.docx

    1. **API9 及以上,router.pushUrl() 的 mode 参数可配置为 Standard 或 Single。**Standard 代表标准模式,Single 则是单例模式。 2. **UIAbility 的生命周期包括 Create、WindowStageCreate、Foreground、...

    HarmonyOS第一课 应用程序框架-闯关习题及答案.docx

    1. API9 及以上,router.pushUrl() 方法的 mode 参数可以配置为 Standard 和 Single 两种模式。这两种模式分别对应不同的页面管理策略。 2. UIAbility 的生命周期包括 Create、WindowStageCreate、Foreground、...

    design-mode:JavaScript设计模式学习笔记

    console.log(Singleton.getInstance() === Singleton.getInstance()); // true ``` 2. **工厂模式** 工厂模式用于创建对象,隐藏对象创建的复杂性。在JavaScript中,可以使用函数或构造函数来实现。例如,创建一个...

    spring学习笔记(五)

    通过设置`proxyMode`,我们可以选择目标Bean是否应该被代理以实现特定的作用域行为。 总之,Spring的Bean Scope是一个强大的工具,帮助开发者管理和控制对象的生命周期,从而满足不同应用场景的需求。正确理解和...

    spring中bean的范围(xml/annotation)

    @Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class SessionScopedBean { // ... } ``` 在实际开发中,选择正确的Bean范围对于优化性能、保证线程安全...

    spring入门学习-3、Bean装配(XML).pdf

    Spring提供了多种作用域,如`singleton`、`prototype`等,不同的作用域决定了Bean的生命周期和创建策略。 4. **Constructor-arguments**:用于通过构造器注入依赖关系。这种方式通常用于必填的依赖项。 5. **...

    Net Remoting配置文件的用法.doc

    - **`<wellknown mode="Singleton"`**:指定服务端激活对象的模式为单例(Singleton)。这意味着所有客户端对这个对象的请求都会共享同一个实例。 - **`type="ComponentHost.CustomerManager,ComponentHost"`**:...

    Android基于配置文件的测试模式(不修改代码通过配置文件来打开和关闭测试模式)

    @Singleton @Component(modules = { AppModule.class }) interface AppComponent { void inject(MyActivity activity); @ConditionalOnTestMode void injectForTesting(MyTestComponent testComponent); } @...

    Remoting的例子

    , YourAssembly" objectUri="MyRemoteService.rem" mode="Singleton" /> ``` 4. 配置客户端:设置客户端的Remoting配置,指定服务器地址和要访问的远程接口。 ```xml , YourAssembly" url=...

Global site tag (gtag.js) - Google Analytics