2

我有一个在超类中使用受保护字段的代码。我怎样才能避免它,因为我认为所有领域都应该是私有的?

 /** "Abstract Builder" */
 abstract class PizzaBuilder {
    protected Pizza pizza;

    public Pizza getPizza() { return pizza; }
    public void createNewPizzaProduct() { pizza = new Pizza(); }

    public abstract void buildDough();
    public abstract void buildSauce();
    public abstract void buildTopping();
 }

 /** "ConcreteBuilder" */
 class HawaiianPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("cross"); }
    public void buildSauce()   { pizza.setSauce("mild"); }
    public void buildTopping() { pizza.setTopping("ham+pineapple"); }
 }

 /** "ConcreteBuilder" */
 class SpicyPizzaBuilder extends PizzaBuilder {
    public void buildDough()   { pizza.setDough("pan baked"); }
    public void buildSauce()   { pizza.setSauce("hot"); }
    public void buildTopping() { pizza.setTopping("pepperoni+salami"); }
 }
4

3 回答 3

4

getPizza()在子类中使用。

所以 :

 public void buildDough()   { pizza.setDough("cross"); }

变成

public void buildDough()   { getPizza().setDough("cross"); }
于 2012-07-01T04:39:00.607 回答
2

您始终可以将夏威夷和辣味比萨制造商公开并保护比萨场。

public abstract class PizzaBuilder {
    protected Pizza pizza;
    ...
 }

 /** "ConcreteBuilder" */
 public class HawaiianPizzaBuilder : PizzaBuilder {
     ...
 }

 /** "ConcreteBuilder" */
 public class SpicyPizzaBuilder : PizzaBuilder {
     ...
 }
于 2012-07-01T04:46:41.093 回答
0

您因此回复评论:

@Logan:感谢您的回答,但是所有类都可以通过 setter/getter 方法访问该字段。但我认为这个解决方案比原来的更好。

如果您想阻止这种情况,那么答案可能是更改 getter 方法的可见性,而根本不提供 setter。


实际上,整体设计看起来有点奇怪。您有一个create不返回它创建的对象的方法,并且没有明显的方法可以调用子类的构建方法。(也许您应该“回顾”工厂对象设计模式。)

在这个级别上重新思考将清楚地表明,pizza变量及其吸气剂可以而且应该从外部视图中隐藏起来。

于 2012-07-01T05:01:20.277 回答