原型模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式。
建造者模式与工厂模式很像 他们的区别是:
建造者模式注重过程
工厂模式注重结果
建造者模式也是一种生产一类对象的模式 但是这一类对象要求生产过程或流程统一 工厂模式只提供了创建的方法具体创建方式由子工厂自己决定 而建造者模式提供了建造的基本流程(标准) 那么子工厂需要按照这些流程来生产(父类只提供基本流程详细步骤还是要子类自己实现) 但是父类是没有办法控制流程的顺序的(流程的顺序是一样的) 若都让子类来控制流程就会造成数据的冗余(因为流程一样 每多一个子类 就多写一份流程) 也更不能让用户来执行流程这样不符合迪米特法则也不符合建造者模式的初衷 所以我们创建一个类来指挥流程的顺序(指挥者)
指挥者 通过聚合一个builder(父类) 来按照顺序调用父类规定的流程 调用完成后返回 建造完成的对象 (指挥者不关心子类是如何实现的他只需要保证流程的顺序即可)
用户也不需要关心流程是什么样的只要能拿到对象就可以了
用户只需要将子类放入指挥者 然后指挥者返回生产好的对象就可以了 若仍然希望只放入标识符就可以生产一个类 可以在建造者模式外层套一层工厂模式即可
以造房子为例
//建造模板(builder的父类)
public abstract class HouseBuilder {
House house = new House();
abstract void buildBasic();
abstract void buildWalls();
abstract void roofed();
public House build(){
return null;
}
House build(String housetype){
house.setBasic(housetype + "Basic");
house.setWall(housetype + "Wall");
house.setRoofed(housetype + "Roof");
return house;
}
}
//房子建造流程交给指挥者
class HouseDirector{
private HouseBuilder houseBuilder;
public HouseBuilder getHouseBuilder() {
return houseBuilder;
}
public HouseDirector(HouseBuilder houseBuilder){
this.houseBuilder = houseBuilder;
}
public HouseDirector(){}
public void setHouseBuilder(HouseBuilder houseBuilder) {
this.houseBuilder = houseBuilder;
}
public House constructHouse(){
houseBuilder.buildBasic();
houseBuilder.buildWalls();
return houseBuilder.build();
}
}
//具体实现的子类
class CommonHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("普通房子打地基");
}
@Override
public void buildWalls() {
System.out.println("普通房子砌墙");
}
@Override
public void roofed() {
System.out.println("普通房子建屋顶");
}
@Override
public House build(){
return build("common");
}
@Override
House build(String housetype) {
return super.build(housetype);
}
}
//具体实现的子类
class HighHouse extends HouseBuilder {
@Override
public void buildBasic() {
System.out.println("高楼打地基");
}
@Override
public void buildWalls() {
System.out.println("高楼砌墙");
}
@Override
public void roofed() {
System.out.println("高楼建屋顶");
}
@Override
public House build(){
return build("high");
}
@Override
House build(String housetype) {
return super.build(housetype);
}
}
//目标类
class House{
private String basic;
private String wall;
private String roofed;
public String getBasic() {
return basic;
}
public void setBasic(String basic) {
this.basic = basic;
}
public String getWall() {
return wall;
}
public void setWall(String wall) {
this.wall = wall;
}
public String getRoofed() {
return roofed;
}
public void setRoofed(String roofed) {
this.roofed = roofed;
}
@Override
public String toString() {
return "House{" +
"basic='" + basic + '\'' +
", wall='" + wall + '\'' +
", roofed='" + roofed + '\'' +
'}';
}
}