在抽象工厂方法中调用单例 class

Invoking a singleton class in a abstract factory method

我有一个class抽象工厂方法如下:

 public abstract class OpClass
    {
        public abstract IHou OperationInvoke(string opClass);
    }

    public class FactoryClass : OpClass
    {
        public override IHou OperationInvoke(string opClass)
        {
            if(opClass == "T")
            {
                //new Treasure();
            }

        }
    }

具体的 "Treasure" class 是这样的:

 public interface IHou
    {
        void Operation(Player p, List<Player> lstPlayers);
    }

public sealed class Treasure : IHou
    {
        private static Treasure instance = null;
        private static readonly object padlock = new object();

        Treasure()
        {

        }

        public static Treasure Instance
        {
            get
            {
                lock (padlock)
                {
                    if (instance == null)
                    {
                        instance = new Treasure();
                    }
                    return instance;
                }
            }
        }

        public void Operation(Player p, List<Player> lstPlayers)
        {
            p.Points = p.Points + 200;

        }
    }

在我的主要方法中,我试图将其称为:

Main()
{
    Player p = //Populate from db;
    List<Player> players = //populate from db 
    OpClass c = new FactoryClass();
    IHou output = c.OperationInvoke("T");
    output.Operation(p, players);
}

但是我需要 "Treasure" class 的单个实例,所以我有了改变正常 [= 的想法34=] class 到单例 class.

那么在这种情况下,我如何创建 Treasure class 的单个实例并保留 facory 模式?如果添加具体 classes 的数量(如 Treasure、House、Blocks 等)无法实施,那么最好的解决方案是什么?

编辑 : 在这里使用工厂模式是不是不合适,因为我的理解是如果我们有很多 class 具有像这个 Treasure 中一样的共同行为,并且再说一个 class 添加了“House”,它以不同的方式计算点,我将允许工厂决定调用哪个实例化。

您可以为此使用 Flyweight 模式,在这种模式中,您将实例存储在缓存或字典中,return 它来自工厂

借助如下所示的基于泛型的工厂实现,您无需添加更多案例,它将基于模板类型 T 创建 class。您可以访问下面的文章 link实施之王。

public class FlyWeidhtFactory
{
    Dictionary<string,IHou> dic = new Dictionary<string,IHou>();

    public IHou OperationInvoke<T>(string opClass)  where T: IHou 
    {
        Type type = typeof(T);
        string fullname = type.FullName;
        if(!dic.Contains(fullname)
        {
           Object obj = Activator.CreateInstance(type);
           dic[fullname] = (T)obj;  
           //no need of more cases 
        }
        return dic[opClass]; 
    }
}

pattern 确保您将创建许多对象,并且通过上述实现,您确定只会创建一个 class 实例。无需选择单例模式。

制作您的混凝土 class internal sealed,这样它就不会在您组装外可见。

以上只是根据您的问题提出的建议。

factory 和 flyweight 文章:

只是return工厂中的单例实例。

你们工厂有责任知道如何'make'。在 Treasure 的情况下,只有一个实例,所以工厂只是 return。

您 return 基于密钥创建共享或非共享实例这一事实使您的代码类似于享元代码。如果没有其他代码需要在工厂外创建 Treasure,那么您就不需要 Singleton。您可以通过使 classes 嵌套在工厂的 classes 中来强制通过工厂实例化它们。

因此,让 Treasure 成为带有私有构造函数的工厂的嵌套 class。或者将其设为私有嵌套 class 并使用工厂方法 return 抽象基础。