单例模式::保证一个类仅有一个实例,并提供一个访问它的全局访问点。单例模式中的“单例”通常用来 代表那些本质上具有唯一性的系统组件。
单例模式的目的就是要控制特定的类只产生一个对象,当然也允许在一定情况下灵活的改变对象的个数。
那么怎么来实现单例模式呢?
一个类的对象的产生是由类构造函数来完成的,如果想限制对象的产生,就要将构造函数变为私有的(至少是受保护的),使得外面的 类不能通过引用来产生对象;同时为了保证类的可用性,就必须提供一个自己的对象以及访问这个对象的静态方法。(只有一个实例对象叫单实例了)
单例模式可分为有状态的和无状态的。
有状态的单例对象一般也是可变的单例对象,多个单态对象在一起就可以作为一个状态仓库一样向外提供服务。没有状态的单例对象也就是不变单例对象,仅用做提供工具函数。
饿汉式:
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!");
}
}
分享到:
相关推荐
- 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。 - 原型模式(Prototype):通过复制已有对象来创建新对象。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定...
创建型模式如单例模式(Singleton)、工厂方法模式(Factory Method)和建造者模式(Builder)等,主要关注对象的创建过程,使得对象的创建过程更加灵活,易于控制。结构型模式如适配器模式(Adapter)、装饰器模式...
标题“design mode”暗示我们将讨论的是设计模式的基本概念及其在Java中的应用。设计模式通常分为三大类:创建型、结构型和行为型模式。 1. **创建型模式**: - **单例模式(Singleton)**:保证一个类只有一个...
- 单例模式(Singleton):保证一个类仅有一个实例,并提供一个全局访问点。 - 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类。 - 抽象工厂模式(Abstract Factory):...
在Android Studio中,我们可以创建一个名为`SingleMode`的Java文件来实现这个饿汉式单例模式的示例。在这个文件中,我们可以定义一个名为`SingletonClass`的类,按照上面的代码结构进行编写。然后在需要使用这个单例...
托管Javscript程序包 基于Lerna的npm软件包的Mono-repo。 配套 工厂工厂 (还没有) ...# Run the tests in watch mode $ npm run test-watch --testMatch ./packages/ < packagename> / ** / * .test.js
创建型模式关注对象的创建,如单例模式(Singleton)、工厂模式(Factory)和建造者模式(Builder)。结构型模式处理对象组合和继承,如适配器模式(Adapter)、装饰器模式(Decorator)和代理模式(Proxy)。行为型...
6. **激活模式(Activation Mode)**:WellKnownObjectMode枚举定义了对象的生命周期。在示例中,Singleton模式表示无论多少个客户端请求,服务器端都只会创建一个RmObj实例。 总的来说,.NET Remoting是一个强大的...
通常情况下,更推荐使用Intent或Parcelable来传递数据,或者使用Singleton、ViewModel等设计模式来实现全局数据共享。 总结起来,Android中的Shared Preferences是一种简单实用的存储方式,适用于存储小量数据。在...
1. **API9 及以上,router.pushUrl() 的 mode 参数可配置为 Standard 或 Single。**Standard 代表标准模式,Single 则是单例模式。 2. **UIAbility 的生命周期包括 Create、WindowStageCreate、Foreground、...
1. API9 及以上,router.pushUrl() 方法的 mode 参数可以配置为 Standard 和 Single 两种模式。这两种模式分别对应不同的页面管理策略。 2. UIAbility 的生命周期包括 Create、WindowStageCreate、Foreground、...
console.log(Singleton.getInstance() === Singleton.getInstance()); // true ``` 2. **工厂模式** 工厂模式用于创建对象,隐藏对象创建的复杂性。在JavaScript中,可以使用函数或构造函数来实现。例如,创建一个...
通过设置`proxyMode`,我们可以选择目标Bean是否应该被代理以实现特定的作用域行为。 总之,Spring的Bean Scope是一个强大的工具,帮助开发者管理和控制对象的生命周期,从而满足不同应用场景的需求。正确理解和...
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS) public class SessionScopedBean { // ... } ``` 在实际开发中,选择正确的Bean范围对于优化性能、保证线程安全...
Spring提供了多种作用域,如`singleton`、`prototype`等,不同的作用域决定了Bean的生命周期和创建策略。 4. **Constructor-arguments**:用于通过构造器注入依赖关系。这种方式通常用于必填的依赖项。 5. **...
- **`<wellknown mode="Singleton"`**:指定服务端激活对象的模式为单例(Singleton)。这意味着所有客户端对这个对象的请求都会共享同一个实例。 - **`type="ComponentHost.CustomerManager,ComponentHost"`**:...
@Singleton @Component(modules = { AppModule.class }) interface AppComponent { void inject(MyActivity activity); @ConditionalOnTestMode void injectForTesting(MyTestComponent testComponent); } @...
, YourAssembly" objectUri="MyRemoteService.rem" mode="Singleton" /> ``` 4. 配置客户端:设置客户端的Remoting配置,指定服务器地址和要访问的远程接口。 ```xml , YourAssembly" url=...