`
ideage
  • 浏览: 323989 次
社区版块
存档分类
最新评论

D语言设计模式 Singleton

阅读更多
引言  语言的进步,可以简化设计模式的实现.

Singleton模式

类型:创建型

意义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

1.D的实现

一个类的实现
class Singleton
{
public:
    static Singleton opCall()
    {
        if(_instance is null) _instance = new Singleton;
        return _instance;
    }
protected void init(){}
private:
    this() {this.init();}
    static Singleton _instance;
}

实现后每次都要复制粘贴,很累,用模版类,更方便:
class Singleton(T)
{  
  public static T opCall()
  {
    if(_instance is null) _instance = new T;
    return _instance;
  }
	
	protected void init(){}
	
  private:
    this() { this.init(); }

    static T _instance;
}


2.使用例子
class Option:Singleton!(Option)
{
   char[] foo(){ return "Hello!";}
}

int main()
{
   writefln(Option().foo);
   return 0;
}
分享到:
评论
8 楼 oldrev 2007-03-07  
引用
3.支持多数类型!!!

经过实践证明这只是理论上的,D没有值类型的透明引用类型,这使得SingletonHolder类只能作右值。
如果要支持内置类型(比如int)的话需要修改 instance() 让其返回指针才能修改int的值,而且Singleton本来就是面向对象的概念,支持内置类型也没太大的必要,那么干脆就只支持 class 、struct、union 好了。
7 楼 ideage 2007-03-07  
赞一个!
引用
SingletonHolder 类避免了继承的麻烦,而且可以支持struct和内置类型


1.用法简洁,不用修改现存的类.
2.优先使用组合,尽量避免继承.
3.支持多数类型!!!
6 楼 oldrev 2007-03-07  
终极修正版:
final class SingletonHolder(T)
{
   	private static T m_instance;

   	private static this()
   	{
		static if(is(T == class))
   			m_instance = new T();
	}

    public static T instance()
    {
		static if(is(T == class))
            assert(!(m_instance is null));
        return m_instance;
    }

    public static T opCall()
    {
        return instance;
    }

	public static T opCast()
	{
		return instance;
	}
}

5 楼 oldrev 2007-03-07  
SingletonHolder 类避免了继承的麻烦,而且可以支持struct和内置类型
4 楼 oldrev 2007-03-07  
引用

qiezi     14 分钟前

代码

   1. alias SingletonHolder!(Foo) S;    
   2. S().x = 2;    

D语言里面可以省去0参数方法的括号,S().x改成S.x能不能编译?我现在出差不方便测试。。。

测试结果:编译错误

楼上说的那个特性好像是0.177新添加的两个struct特性
1. struct S;   S s(x) 将被编译器实现为 S s = S(x)
2. S s = x; 将实现为 S s = S(x)
也就是 struct 的 static opCall 用起来像 ctor
3 楼 qiezi 2007-03-07  
alias SingletonHolder!(Foo) S;   
S().x = 2;   


D语言里面可以省去0参数方法的括号,S().x改成S.x能不能编译?我现在出差不方便测试。。。
2 楼 ideage 2007-03-07  
写的很好!学习!!!
1 楼 oldrev 2007-03-07  
我写了一个不使用继承的:
final class SingletonHolder(T)
{
   	private static T m_instance;

   	private static this()
   	{
		static if(is(T == class))
   			m_instance = new T();
	}

    public static T instance()
    {
        assert(m_instance);
        return m_instance;
    }

    public static T opCall()
    {
        return instance;
    }

	public static T opCast()
	{
		return instance;
	}

    private ~this()
    {
    }
}

unittest
{
	class Foo
	{
		public int x;

	}

	alias SingletonHolder!(Foo) S;
	S().x = 2;
	(cast(Foo)S).x = 2;
}

相关推荐

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    通过深入理解这些设计模式,我们可以更好地进行面向对象的分析与设计(OOA/D),提高代码的质量和系统的可维护性。 #### 0.1 设计模式解析(总序) 设计模式不仅仅是一系列具体的解决方案,更是一种思维方式。它们...

    23种设计模式(C++).pdf

    设计模式是面向对象编程领域中...通过阅读GoF的《设计模式:可复用面向对象软件的基础》等经典书籍,以及在项目中实践设计模式,可以提升开发人员对面向对象分析和设计(OOA/D)的理解,从而提高软件开发的效率和质量。

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    书中提到,理解设计模式是掌握面向对象分析与设计(OOA/D)精髓的关键所在。通过深入研究GoF的23种模式,读者不仅能学到设计模式本身,还能掌握如何在实际项目中灵活运用它们。 #### 0.2 设计模式解析后记 作者在...

    23种设计模式解析附C++实现

    掌握了设计模式,就相当于掌握了面向对象分析和设计(OOA/D)的核心。在实际的软件开发过程中,设计模式使得软件系统的结构更加合理,提高了代码的可重用性、可维护性以及系统的扩展性,它能够帮助开发者写出更加...

    C++版本设计模式

    从引言中可以看出,设计模式对于面向对象分析和设计(OOA/D)来说至关重要。设计模式不是某种特定的代码,而是一种概念上的解决方案框架,它帮助开发者解决软件设计中经常出现的问题。从Singleton模式可以看出,设计...

    c++设计模式GoF23

    掌握设计模式意味着理解面向对象分析与设计(OOA/D)的核心精髓。设计模式不仅仅是编程技巧的集合,更是开发者思想的体现。 #### 1. 创建型模式 - **Factory 模式**:此模式提供了一个创建对象的接口,但允许子类...

    23种设计模式 C++ PDF

    本文旨在深入解析由GoF(Gang of Four)提出的23种设计模式,并通过C++语言具体实现这些模式来帮助读者更好地理解和掌握面向对象设计的核心思想。设计模式作为面向对象编程的重要组成部分,为解决特定问题提供了一套...

    设计模式精解-GoF23种设计模式解析

    ”掌握设计模式不仅能够提高面向对象分析和设计(OOA/D)的能力,还能让开发者在面对复杂问题时拥有更多创新解决方案。 ##### 0.2 设计模式解析后记 本书通过对每个设计模式进行详细解析,不仅介绍了模式的基本概念...

    设计模式精解-GoF23种设计模式解析附C实现源码.pdf

    正如本书作者所言,“懂了设计模式,你就懂了面向对象分析和设计(OOA/D)的精要”。 #### 三、设计模式分类 GoF中的23种设计模式被分为三大类:创建型模式、结构型模式和行为型模式。 ##### 1. 创建型模式 - **...

    c++设计模式 设计模式精解-GoF 23种设计模式解析附C++实现源码

    设计模式是面向对象分析和设计(OOA/D)的重要组成部分。它们提供了解决常见软件设计问题的标准化方法。通过学习和应用设计模式,开发者能够更高效地解决软件工程中的挑战,提高软件的质量和可维护性。设计模式不仅...

    设计模式C++版.pdf

    设计模式是软件工程领域中,面向对象分析和设计(OOA/D)的核心概念。它们为软件设计中常见问题提供了一系列经过验证的解决方案,旨在提升代码的可复用性、可扩展性和灵活性。本文件《设计模式C++版.pdf》深入探讨了...

    GoF+23种设计模式解析附C++实现源码

    掌握了设计模式,就相当于掌握了面向对象分析与设计(OOA/D)的核心要素。本文将详细介绍GoF的23种设计模式,并提供相应的C++实现源码,希望能为读者带来新的启示和灵感。 #### 三、设计模式分类 设计模式通常被分为...

Global site tag (gtag.js) - Google Analytics