【发布时间】:2018-05-24 06:30:34
【问题描述】:
我有一个带有抽象工厂方法的类,如下所示:
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”类是这样的:
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" 类更改为单例类。 p>
那么在这种情况下,我如何创建 Treasure 类的单个实例并保留工厂模式?如果添加了诸如 Treasure 、 House 、 Blocks 等具体类的数量,那么最好的解决方案是什么?
编辑:在这里使用工厂模式不合适吗,因为我的理解是,如果我们有很多具有共同行为的类,比如这个 Treasure,然后再说一个类“House”被添加,它以不同的方式计算点,我将允许工厂决定调用哪个实例化。
【问题讨论】:
-
请注意,如果
instance为空,您应该也检查锁外,否则您每次都必须锁定,即使您有实例,这意味着线程将必须争取一把锁。外面一张,里面一张。 -
你可以使用 DI 容器吗?像这样的事情通常是 DI 容器的责任。任何 DI 容器都可以开箱即用地管理这个。
-
你不需要工厂模式。当初始化实例所需的参数数量很大并且初始化不直接,或者当您在初始化和使用实例之间需要一些额外的逻辑时,使用工厂模式。你的
Treasure甚至不带一个参数...
标签: c# .net design-patterns c#-4.0