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



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

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();
}
}
}

具体的"宝藏"类是这样的:

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"类的单个实例,所以我想到了将普通的"Treasure">类更改为单例类的想法。

那么在这种情况下,我如何创建 Treasure 类的单个实例并保留 facory 模式?如果无法实现,如果添加诸如宝藏,房屋,方块等具体类的数量,最佳解决方案是什么?

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

您可以使用Flyweight 模式,在此模式中,您将实例存储在缓存或字典中并从工厂返回

借助基于泛型的工厂实现,如下所示,您不需要添加更多情况,它将基于模板类型T创建类。 您可以访问下面的文章链接,具有相同的实现之王。

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,使其在装配体外不可见。

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

工厂和蝇量级文章:

  • 蝇量级设计模式
  • 泛型的工厂设计模式

只需在工厂中返回单一实例。

您的工厂有责任知道如何"制造"。在 Treasure 的情况下,只有一个实例,因此工厂只返回该实例。

您基于键返回共享或非共享实例的事实使您的代码类似于蝇量级。如果没有其他代码需要在工厂外创建 Treasure,那么您不需要 Singleton。您可以通过工厂强制实例化类,方法是将它们设置为工厂的嵌套类。

因此,使 Treasure 成为具有私有构造函数的工厂的嵌套类。或者使其成为私有嵌套类,并使用工厂方法返回抽象基。

最新更新