首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在抽象工厂方法中调用单例类

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

Stack Overflow用户
提问于 2018-05-24 06:30:34
回答 2查看 641关注 0票数 2

我有一个抽象工厂方法类,如下所示:

代码语言:javascript
复制
 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();
            }

        }
    }

具体的“宝藏”类是这样的:

代码语言:javascript
复制
 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;

        }
    }

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

代码语言:javascript
复制
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);
}

但是我需要一个“宝藏”类的实例,所以我有了将普通的“宝藏”类更改为单个类的想法。

因此,在这个场景中,我如何创建一个单独的宝藏类实例,同时也保留facory模式?如果不可能实现,最好的解决方案是,如果增加的具体类的数量,如宝藏,房子,块等?

编辑:在这里使用工厂模式不合适吗,因为我的理解是,如果我们有许多类具有相同的行为,比如在本“宝藏”中,然后再添加一个类"House“,以不同的方式计算点数,我将允许工厂决定调用哪个类来实例化。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-24 06:54:54

在这种模式中,您可以将实例存储在缓存或字典中,并从工厂返回实例。

在以下基于泛型的工厂实现的帮助下,您不需要添加更多的案例,它将创建基于模板类型T的类。您可以访问下面的文章链接,具有相同的实现王。

代码语言:javascript
复制
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]; 
    }
}

模式确保要创建许多对象,通过上面的实现,您可以确保只创建类的一个实例。不需要单例模式。

使您的具体类internal sealed,因此它将在您的程序集之外不可见。

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

工厂用品及飞重:

票数 1
EN

Stack Overflow用户

发布于 2018-05-24 07:12:25

只需返回工厂中的单例实例即可。

你们工厂有责任知道如何‘制造’。在宝藏的例子中,只有一个实例,所以Factory只返回这个实例。

基于键返回共享实例或未共享实例的事实使代码类似于flyweight。如果没有其他代码需要在工厂之外创建宝藏,那么就不需要Singleton了。您可以通过使这些类成为工厂的嵌套类,强制通过工厂实例化这些类。

因此,使用私有构造函数,使之成为工厂的嵌套类。或者让它成为一个私有嵌套类,并使用工厂方法返回一个抽象基。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50502441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档