单例模块儿

#单例模块,存在的意义就是在模块被载入类时,给类添加类方法和创建对象实例等
module Singleton
#这个方法在模块被载入类时调用,传入的参数是 类对象
def self.included(base)
#这个操作把另一个模块直接添加到Class对象上。类对象上的方法就是类方法。尽管模块中的方法是模块的实例方法。
base.extend(SingletonClass); #让类对象引入另外一个模块:SingletonClass
puts("Singleton Include!");
#创建类的实例,然后把类的new方法设为私有类方法,防止被调用,最后把类的实例存放到类的方法中。
myInstance=base.new(); #实例化
base.private_class_method :new #将该类对象的new方法设置为private,让外部无法访问
base.setClass(myInstance); #这个setClass 方法是SingletonClass模块的实例方法,但是因为base.extend(SingletonClass)将模块直接添加到了Class对象上,即base上,所以这个时候setClass是base这个类对象的实例方法,即是某目标类的类方法。
end
end


#这个模块附加上去的类方法,把类实例保存在模块的实例变量中。也就是目标类的类变量中。
module SingletonClass
def setClass(base)
puts("setClass");
@myClass=base;
return @myClass;
end
#单例方法,仅仅返回类的保护实例变量。
def instance()
puts("instance");
return @myClass;
end
end


class Test
include Singleton;
def say(val)
puts(val);
end
end



test=Test.instance();

test.say("sssssss");

#test=Test.new(); # fail
<think>好的,用户想了解如何用不同编程语言实现设计式。首先,我需要回顾式的基本概念,确保自己理解正确。式确保一个类只有一个实,并提供全局访问点。根据引用中的资料,不同语言有不同的实现方式,比如Java、C、Go等。 接下来,我需要整理各个语言的实现方法。首先看Java,用户提供的引用[1]提到使用泛型实现,引用[4]展示了懒汉式线程不安全的子。但线程安全需要考虑,比如双重检查锁或者静态内部类。然后C语言,引用[2]提到使用静态指针和全局访问函数,可能需要静态变量和互斥锁来保证线程安全。Go语言在引用[4]中有懒汉式示,但线程安全需要用sync.Once。 然后,Python的实现通常可以用模块级别的变量,或者通过类装饰器、元类来实现。用户可能还希望了解其他语言比如C#或JavaScript,但引用中没有提到,需要根据现有知识补充。 需要注意各个实现中的线程安全问题和延迟初始化(懒汉vs饿汉)。同时,不同语言的语法特性不同,比如Java的静态变量,C的静态指针,Go的sync.Once,Python的装饰器等。 还要检查每个示是否符合式的要点:私有构造函数、静态实获取方法、线程安全、防止反射/反序列化破坏等。不过根据用户的问题,可能只需要基本实现,不需要深入细节。 最后,确保回答结构清晰,分语言说明,给出代码示,并标注引用来源。同时生成相关问题,如线程安全、应用场景、优缺点等,帮助用户进一步学习。</think>### 设计式实现方法(多语言示式通过限制类的实化次数为1次,并提供全局访问点来确保唯一性[^3]。以下是不同编程语言的实现方法: --- #### 1. **Java实现** - **饿汉式**(线程安全,类加载时初始化): ```java public class Singleton { private static final Singleton instance = new Singleton(); private Singleton() {} // 私有构造函数 public static Singleton getInstance() { return instance; } } ``` - **懒汉式+双重检查锁**(延迟初始化,线程安全)[^4]: ```java public class Singleton { private static volatile Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` --- #### 2. **C语言实现** - **静态指针+全局访问函数**(需手动管理线程安全)[^2]: ```c typedef struct Singleton { int data; } Singleton; static Singleton* instance = NULL; Singleton* getInstance() { if (instance == NULL) { instance = (Singleton*)malloc(sizeof(Singleton)); instance->data = 0; } return instance; } ``` --- #### 3. **Go语言实现** - **sync.Once实现**(线程安全,延迟初始化)[^4]: ```go package main import "sync" type Singleton struct { Data int } var instance *Singleton var once sync.Once func GetInstance() *Singleton { once.Do(func() { instance = &Singleton{Data: 42} }) return instance } ``` --- #### 4. **Python实现** - **模块级变量**(天然): ```python class Singleton: _instance = None def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance ``` - **装饰器实现**(通用性强): ```python def singleton(cls): instances = {} def get_instance(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return get_instance @singleton class MyClass: pass ``` --- ### 关键实现要点 1. **私有构造函数**:防止外部直接实化[^3]。 2. **静态实访问方法**:如`getInstance()`。 3. **线程安全**:通过锁或原子操作(如Java双重检查锁、Go的`sync.Once`)。 4. **延迟初始化**:按需创建实(懒汉式)[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值