我越来越熟悉工厂模式(以及策略模式),以及这种模式能带来多大的好处。然而,我一直在努力应对以下情况:
以前,我会这样做,其中有一个经理类,可以创建和保存一辆汽车。这里没有依赖项注入,实现也很糟糕,特别是在尝试单元测试时。
public class CarManager
{
public static Car GetCarFromDatabase(int carId) { return new Car(); }
public static void SaveCar(Car car) { }
}我现在明白了,我如何能够有不同的Factories为我制造汽车,无论是从数据库,还是在任何地方!这太棒了!所以,我的问题是:
Q1:我的理解是,Factories只应该构建对象,对吗?如果是的话,那我的第二个问题呢?
Q2:如果我遵循工厂模式来构建对象,我应该如何保存我的对象?对此是否有不同的模式,还是我没有完全理解工厂模式?
发布于 2010-10-27 17:06:20
工厂模式应该有助于创建对象。这就是为什么它被归类为“创造”模式的原因。要回答第一个问题,不应将其用于持久化对象。
存储库模式是一种持久性模式,用于将对象保存到某种持久性机制或从持久性机制检索数据。根据Martin的说法,这实际上是一种与典型设计模式不同的企业模式。
在考虑您的问题时,您想看看固体中的S原理,它规定类应该有一个单独的责任,这意味着它应该有一个改变的原因。在本例中,当谈到创建对象以及保存(持久化)对象时,有两个原因要更改的类。现在,它看起来可能是一个单一的责任,因为Repository可以检索对象并将其保存到您的应用程序中,并且检索看起来像一个工厂(并且通常是存储库中的一个工厂对象),但是在您所描述的对象中,您的对象有太多的责任。
发布于 2010-10-27 17:05:29
工厂不应该保存数据。数据访问对象(DAO)或表映射程序将是一个更好的主意。
发布于 2010-10-27 21:06:12
这一切都取决于你的需求和你想要做的事情,模式是实践--没有标准--它们鼓励代码重用,模式不是一成不变的。那么,为什么不使用工厂模式来使对象持久化呢?这就是我如何使用这种模式来解决从不同数据库读取/写入数据的问题,也许这不是使用该模式的更好形式,但它目前正在工作,是可扩展的,分布在各层之间,几乎每个人都能理解它:
namespace Domain.App
{
public class PresentationClass
{
private Collection<ISomeOutput> GetData(ISomeInput1 input)
{
ServicesLogicContext logic = new ServicesLogicContext( (MyType) Identifier );
return logic.GetSomeData(input) as Collection<ISomeOutput>;
}
private IMethodResult ExecuteSomeAction(ISomeInput2 input)
{
ServicesLogicContext logic = new ServicesLogicContext( (MyType) Identifier);
return logic.ExecuteSomeAction(input);
}
}
}
namespace Domain.Logic
{
public sealed class ServicesLogicContext : ServicesLogicContextBase
{
public IList<ISomeOutput> GetSomeData(ISomeInput1 input)
{
DBServices services = DBServicesProvider.CreateServices(SomeIdentifier);
return DBServicesProvider.GetSomeData(input);
}
public IMethodResult ExecuteSomeAction(ISomeInput2 input)
{
DBServices services = DBServicesProvider.CreateServices(SomeIdentifier);
IMethodResult result = services.ExecuteSomeAction(input);
return result;
}
}
}
namespace Domain.Data
{
public abstract class DBServices : IServices
{
public virtual IList<ISomeOutput> GetSomeData(ISomeInput1 input) {...}
public virtual IMethodResult ExecuteSomeAction(ISomeInput2 input) {...}
}
public class DBServicesSpecific1 : DBServices
{
public override IList<ISomeOutput> GetSomeData(ISomeInput1 input) {...}
public override IMethodResult ExecuteSomeAction(ISomeInput2 input) {...}
}
public class DBServicesSpecific2 : DBServices
{
public override IList<ISomeOutput> GetSomeData(ISomeInput1 input) {...}
public override IMethodResult ExecuteSomeAction(ISomeInput2 input) {...}
}
public sealed class DBServicesProvider
{
public static DBServices CreateServices(MyType identifier)
{
DBServices result = null;
switch(identifier)
{
case MyType.Specific1: result = new DBServicesSpecific1(); break;
case MyType.Specific2: result = new DBServicesSpecific2(); break;
}
return result;
}
}
}https://stackoverflow.com/questions/4035691
复制相似问题