首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构建器模式与数据封装

构建器模式与数据封装
EN

Stack Overflow用户
提问于 2021-01-12 23:09:57
回答 1查看 103关注 0票数 0

在使用builder模式时,我应该如何保留OOP的封装原则?我的意思是,构建器应该在对象和使用它的代码之间提供抽象层,以便可以逐个部分地构造,这需要为我们通常在构造函数中传递的对象的每个参数创建setter。这在某些情况下可能是不可取的,因为我不希望客户端能够修改我必须通过构建器修改的值。下面的例子描述了我的意思:

代码语言:javascript
复制
public class Cat
{
    private string _race;
    private string _name;
    public Cat()
    {
         _race = "common";
         _name = string.Empty;
    }
    public void setRace(string race) { _race = race; }
    public void setName(string name) { _name = name; }
}

public class CatBuilder
{
    private Cat _objectUnderConstruction;
    public CatBuilder() { _objectUnderConstruction = new Cat(); }
    public CatBuilder WithName(string name)
    {
         _objectUnderConstruction.setName(name);
         return this;
    }
    public CatBuilder OfRace(string race)
    {
         _objectUnderConstruction.setRace(race);
         return this;
    }

}

这不是生产代码,我现在写它是为了表达,所以不要对它是如何构造的感到生气。

在上面的示例中,需要设置cat的race,因为我们需要这些信息来填充对象,所以我们需要向它传递信息。同时,我不希望任何人在我的猫的生命周期内改变它的种族(例如,它会在处理过程中从埃及变成英国),通常我会去掉访问器方法,但我需要构建器。这样,数据的封装就会受到影响(因为get和set不会封装任何东西),所以我想避免这种情况。

这个例子很简单,我可以在构造函数中传递参数,但是想象一下更大的类,其中有很多这样的字段,在这种情况下会发生什么?我是应该在内部传递一些配置对象(它很像builder,但更简单,因此builder是没有意义的),还是应该将builder本身传递给构造函数(这很奇怪,但我知道什么呢)?

我该怎么做呢?

EN

回答 1

Stack Overflow用户

发布于 2021-01-12 23:27:55

如果您的构建器与您的类紧密耦合,则可以使正在构造的对象成为Builder子类:

代码语言:javascript
复制
public class Cat
{
    private string _race;
    private string _name;
    public Cat()
    {
         _race = "common";
         _name = string.Empty;
    }
    private void setRace(string race) { _race = race; }
    private void setName(string name) { _name = name; }

    public class Builder
    {
         private Cat _objectUnderConstruction;
         public CatBuilder() { _objectUnderConstruction = new Cat(); }
         public CatBuilder WithName(string name)
         {
             _objectUnderConstruction.setName(name);
             return this;
         }
         public CatBuilder OfRace(string race)
         {  
             _objectUnderConstruction.setRace(race);
             return this;
         }
    }
}

这样,您就可以在Builder中访问Cat的私有字段和方法,并像使用new Cat.Builder().OfRace("").OfName("").Build()一样使用它。

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

https://stackoverflow.com/questions/65686633

复制
相关文章

相似问题

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