【问题标题】:Implementation of Hierarchical Builder pattern层次构建器模式的实现
【发布时间】:2020-03-17 09:53:31
【问题描述】:

我正在实施分层构建器模式。我使用泛型将我的 Parent Builder setter 的返回类型设置为子级。在调用父 setter 方法后使用子 setter 方法时,我仍然面临问题。我不想在我的父生成器中定义我的子特定方法(此处为 setEngine(String))。有没有其他办法解决这个问题?

我已经为上述问题制作了一个示例 sn-p,与此案例相同。

CarFactory -> 它返回用户想要的特定汽车的对象

Car -> 所有 Car 类型、Swift、Duster 等的父级

Swift -> 特定汽车

父->子层次结构

汽车 -> 斯威夫特

CarBuilder -> SwiftBuilder

Car.java

 package Builders;

 public class Car {
   int tyre;
   int seat;
   public int getTyre() {
       return tyre;
   }
   public void setTyre(int tyre) {
       this.tyre = tyre;
   }
   public int getSeat() {
       return seat;
   }
   public void setSeat(int seat) {
       this.seat = seat;
       
   }
   
}

Swift.java

package Builders;

public class Swift extends Car {
    boolean safetyAirbag;
    String engine;
    
    public boolean isSafetyAirbag() {
        return safetyAirbag;
    }

    public String getEngine() {
        return engine;
    }

    public void setSafetyAirbag(boolean safetyAirbag) {
        this.safetyAirbag = safetyAirbag;
    }

    public void setEngine(String engine) {
        this.engine = engine;
    }


}

CarBuilder.java

package Builders;

public abstract class CarBuilder {
        int tyre;
        int seat;
         
        public abstract <B extends CarBuilder>B self();
        public abstract <T extends Car>T typeOfCar();
            
        public <B extends CarBuilder>B setTyre(int tyre) {
            this.tyre = tyre;
            return self();
        }
        
        public  <B extends CarBuilder> B setSeat(int seat) {
            this.seat = seat;
            return self();
        }
        public <C extends Car>C build()
        {   C car=this.typeOfCar();
            car.setSeat(seat);
            car.setTyre(tyre);
            return car;
        }
    
        
}

SwiftBuilder.java

package Builders;

public class SwiftBuilder extends CarBuilder {
    String engine;
    @Override
    public
    SwiftBuilder self() {
        
        return this;
    }

    @Override
    public
    Swift typeOfCar() {
        
        return new Swift();
    }

    public SwiftBuilder setEngine(String string) {
        this.engine=string;
        return this;
    }
    public Swift build()
    {   Swift s=(Swift)super.build();
        return s;
    }

}

CarFactory.java

package Builders;

public class CarFactory {
    public SwiftBuilder getSwiftDesire()
    {
        return new SwiftBuilder();
    }
}
 

Drivers.java

package Builders;

public class Drivers {
    Swift getMyCar() {
        Swift s= this.factory().getSwiftDesire().setSeat(4).setEngine("CC").build();
        return s;
    }
    CarFactory factory() {
        return new CarFactory();
    }
}

在 Drivers.java 类中,我无法在 setSeat() 方法之后使用 setEngine() 方法, this.factory().getSwiftDesire().setSeat(4).setEngine("CC").build(); 我不想在父类中声明 setEngine,有什么办法吗?

提前谢谢你!

【问题讨论】:

    标签: java generics inheritance design-patterns builder-pattern


    【解决方案1】:

    您需要在 CarBuilder 中的类级别而不是方法级别使用泛型:

    package Builders;
    
    public abstract class CarBuilder<B extends CarBuilder<B, C>, C extends Car> {
        int tyre;
        int seat;
    
        public abstract B self();
    
        public abstract C typeOfCar();
    
        public B setTyre(int tyre) {
            this.tyre = tyre;
            return self();
        }
    
        public B setSeat(int seat) {
            this.seat = seat;
            return self();
        }
    
        public C build() {
            C car = this.typeOfCar();
            car.setSeat(seat);
            car.setTyre(tyre);
            return car;
        }
    
    }
    

    然后你定义你的 SwiftBuilder:

    package Builders;
    
    public class SwiftBuilder extends CarBuilder<SwiftBuilder, Swift> {
        String engine;
    
        @Override
        public SwiftBuilder self() {
    
            return this;
        }
    
        @Override
        public Swift typeOfCar() {
    
            return new Swift();
        }
    
        public SwiftBuilder setEngine(String string) {
            this.engine = string;
            return this;
        }
    
        public Swift build() {
            Swift s = super.build();
            s.setEngine(engine);
            return s;
        }
    
    }
    

    而且它有效。

    【讨论】:

    • 这太棒了,这就是我要找的!了解 Java 泛型中的新事物。谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多