我可以创建一个“全局”对象来存储多个对象的变量吗?
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
也不会使其完全线程安全。而且单实例和单例显然是有区别的。以上是关于我可以创建一个“全局”对象来存储多个对象的变量吗?的主要内容,如果未能解决你的问题,请参考以下文章
可以从 Windows DLL 中的全局变量创建/销毁 std::threads 吗?