首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用工厂模式保存数据?

用工厂模式保存数据?
EN

Stack Overflow用户
提问于 2010-10-27 16:58:27
回答 5查看 4.3K关注 0票数 11

我越来越熟悉工厂模式(以及策略模式),以及这种模式能带来多大的好处。然而,我一直在努力应对以下情况:

以前,我会这样做,其中有一个经理类,可以创建和保存一辆汽车。这里没有依赖项注入,实现也很糟糕,特别是在尝试单元测试时。

代码语言:javascript
复制
public class CarManager
{
    public static Car GetCarFromDatabase(int carId) { return new Car(); }

    public static void SaveCar(Car car) { }
}

我现在明白了,我如何能够有不同的Factories为我制造汽车,无论是从数据库,还是在任何地方!这太棒了!所以,我的问题是:

Q1:我的理解是,Factories只应该构建对象,对吗?如果是的话,那我的第二个问题呢?

Q2:如果我遵循工厂模式来构建对象,我应该如何保存我的对象?对此是否有不同的模式,还是我没有完全理解工厂模式?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-27 17:06:20

工厂模式应该有助于创建对象。这就是为什么它被归类为“创造”模式的原因。要回答第一个问题,不应将其用于持久化对象。

存储库模式是一种持久性模式,用于将对象保存到某种持久性机制或从持久性机制检索数据。根据Martin的说法,这实际上是一种与典型设计模式不同的企业模式。

在考虑您的问题时,您想看看固体中的S原理,它规定类应该有一个单独的责任,这意味着它应该有一个改变的原因。在本例中,当谈到创建对象以及保存(持久化)对象时,有两个原因要更改的类。现在,它看起来可能是一个单一的责任,因为Repository可以检索对象并将其保存到您的应用程序中,并且检索看起来像一个工厂(并且通常是存储库中的一个工厂对象),但是在您所描述的对象中,您的对象有太多的责任。

票数 16
EN

Stack Overflow用户

发布于 2010-10-27 17:05:29

工厂不应该保存数据。数据访问对象(DAO)或表映射程序将是一个更好的主意。

票数 3
EN

Stack Overflow用户

发布于 2010-10-27 21:06:12

这一切都取决于你的需求和你想要做的事情,模式是实践--没有标准--它们鼓励代码重用,模式不是一成不变的。那么,为什么不使用工厂模式来使对象持久化呢?这就是我如何使用这种模式来解决从不同数据库读取/写入数据的问题,也许这不是使用该模式的更好形式,但它目前正在工作,是可扩展的,分布在各层之间,几乎每个人都能理解它:

代码语言:javascript
复制
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;
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4035691

复制
相关文章

相似问题

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