建造者设计模式:
使用多个简单的对象一步构建一个复杂的对象,这种类型的设计模式属于创建者模式。
介绍:
意图:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:有时候面临一个复杂对象的创建工作,其通常由各个部分的子对象使用一定的算法构成,由于需求的改变,这个复杂的对象的各个部分经常面临着剧烈的变化,但是将他们组合在一起的算法去相对稳定。
何时使用:一些基本不会变,而其组合经常变化的时候。
关键代码:建造者:创建和提供实例,导演:管理创建出来的实例的依赖关系。
应用实例:1去肯德基,可乐,汉堡以及鸡翅是不会变化的,但是客户点餐的套餐组合是不一样的。
优点:1建造者独立,容易扩展。2便于控制细节风险。
缺点:1产品必须具有共同点,范围有限制。2如果内部变化复杂,会导致有很多建造类。
使用场景:1需要生成的对象具有复杂的内部结构。2需要生成的对象内部属性本身相互依赖。
注意事项:与工厂模式不同,建造者模式更加强调零件之间的装配的顺序。
模式角色:
建造者角色:定义生成实例所需要的所有方法。
具体的建造者角色:实现生成实例所需要的所有方法,并且定义获取最终实例的方法。
监工角色:定义使用建造者角色中的方法来生成实例的方法。
使用者:使用建造者模式。
uml图:
Product类
import java.util.ArrayList; import java.util.List; //Product类,由多个部件组成。 public class Product { List<String> parts=new ArrayList<>(); //添加产品部件 public void add(String part){ parts.add(part); } //列举所有的产品部件 public void show(){ System.out.println("\n 产品创建---------"); for (String item : parts) { System.out.println(item); } } }
Builder类:
//抽象建造类,确定产品由两个部件构成,parta,partb组成, //并声明一个得到产品建造类结果的方法 public abstract class Builder { public abstract void buildPartA(); public abstract void buildPartB(); public abstract Product getResult(); }
ConcreteBulider类:
//具体的建造类 public class ConcreteBuilder1 extends Builder{ private Product product=new Product(); @Override public void buildPartA() { // TODO 自动生成的方法存根 product.add("部件A"); } @Override public void buildPartB() { // TODO 自动生成的方法存根 product.add("部件B"); } @Override public Product getResult() { // TODO 自动生成的方法存根 return product; } }
public class ConcreteBuilder2 extends Builder{ private Product product=new Product(); @Override public void buildPartA() { // TODO 自动生成的方法存根 product.add("部件X"); } @Override public void buildPartB() { // TODO 自动生成的方法存根 product.add("部件Y"); } @Override public Product getResult() { // TODO 自动生成的方法存根 return product; } }
Director类:
//指挥者类,用来指挥创建过程 public class Director { public void Construct(Builder builder) { builder.buildPartA(); builder.buildPartB(); } }
客户端代码:
public class Client { //客户不需要知道具体的建造过程。 public static void main(String[] args) { // TODO 自动生成的方法存根 Director director=new Director(); Builder builder=new ConcreteBuilder1(); Builder builder2=new ConcreteBuilder2(); //指挥者用concretebuilder的方法来建造产品。 director.Construct(builder); Product p1=builder.getResult(); p1.show(); director.Construct(builder2); Product product=builder2.getResult(); product.show(); System.out.println("=========="); } }
总结:
建造者模式的使用场合是当创建复杂对象的时候,把创建对象成员和装配方法分离出来,放在建造者类中去实现,当用户使用该复杂对象的时候,不用理会它的创建和装配过程,只需要它的表现形式。
来源:https://www.cnblogs.com/dystar/p/10931875.html