我可以创建一个“全局”对象来存储多个对象的变量吗?

Posted

技术标签:

【中文标题】我可以创建一个“全局”对象来存储多个对象的变量吗?【英文标题】:Can I make a "global" object to store variables for multiple objects? 【发布时间】:2012-11-13 03:23:26 【问题描述】:

我正在创建一个将显示多个图形的图形应用程序。这些图表需要访问一些全局数据和一些特定于图表的数据。例如,我希望颜色一致,这样就可以是全局的,但特定的图表可以有不同的网格间距(每个图表)。

我创建了一个带有设置默认值的“主对象”和一个带有每个图形配置选项的派生对象

class GraphMasterObject 
  public Color gridcolor = Color.Red;


class GraphObject : GraphMasterObject 
  public int gridSpacing = 10;

现在,根据我的理解,我应该可以做到这一点

GraphObject go = new GraphObject();
Color c = go.gridColor;

如果我更改 go.gridColor,我怎样才能使它在继承自 GraphMasterObject 的所有对象中发生变化?这甚至可能吗?如果不是,还有哪些其他可能的解决方案?类似的东西

GraphMasterObject gmo = new GraphMasterObject();
gmo.gridColor = Color.Blue;

GraphObject go = new GraphObject();
go.gridColor = Color.Blue;

【问题讨论】:

为什么不使用gridColor的静态属性,而不是将其定义为实例属性? 【参考方案1】:

为什么要使用继承?为什么不只是将 GlobalGraphSettings 对象传递给所有 Graph 对象,然后您就可以这样做

MyColor = Graph.GlobalSettings.Color;

【讨论】:

是的。使用 IoC 框架来做这件事,这是一个更甜蜜的解决方案。同时,建立一个为您建立这种关系的工厂。单身很烂。【参考方案2】:

在多个对象之间共享单个对象实例的一种常见方法是单例模式。

http://en.wikipedia.org/wiki/Singleton_pattern

使用单例模式,任何对象都可以请求单例对象,并且将返回与请求单例对象的任何其他对象相同的单例对象实例。

在您的情况下,这似乎是一个很好的解决方案。

在 C# 中实现此模式的一种方法是使用 static 属性,例如:

public class MySingleton

    static private MySingleton singleton = null;

    private static readonly object padlock = new object();

    static public MySingleton Retrieve
    
        get
        
            lock (padlock)
            
                if (singleton == null) singleton = new MySingleton(); // Initialize as needed
            
            return singleton;
        
    

用法

MySingleton singleton = MySingleton.Retrieve;

更新

这是一个优于上面的实现,来自@Marksl 提供的文章

public sealed class Singleton

    private static readonly Lazy<Singleton> lazy =
        new Lazy<Singleton>(() => new Singleton());

    public static Singleton Instance  get  return lazy.Value;  

    private Singleton()
    
    

【讨论】:

如果我的对象继承自单例,它也会是单例吗?我希望能够透明地访问对象和全局对象的数据 我不完全同意单例。您还可以拥有一个对象的单个实例,这实际上与单例不同。如果值是不稳定的,每个线程都应该得到最新的副本。 @DarthVader:“对象的单个实例”与单例模式有何不同? @DarthVader:根据我的回答中的注释,如果您在空检查和初始化周围添加锁定。 @EricJ。不,即使lock 也不会使其完全线程安全。而且单实例和单例显然是有区别的。

以上是关于我可以创建一个“全局”对象来存储多个对象的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章

全局对象与多个新对象?

spring中静态类调用非静态对象的方法

可以从 Windows DLL 中的全局变量创建/销毁 std::threads 吗?

你可以在javascript中使用模板文字创建对象属性名称吗?

Java数据结构选择

iOS 开发:我可以在 Core Data 对象中存储整数数组而不创建新表来表示数组吗?