• 设计模式-建造者模式(05)


    定义

      建造者模式(Builder Pattern)也叫做生成器模式。英文原话是:Separate the construction of a complex object from its representation so that the same construction process can create different representations.意思是:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

    UML图

    代码

    在建造者模式中,可以分为四个角色:

      1.抽象建造者(Builder)角色:该角色用于规范产品的各个组成部分,并进行抽象,一般独立于应用程序的逻辑。
      2.具体建造者(Concrete Builder)角色:该角色实现抽象建造者中定义的所有方法,并且返回一个组建好的产品实例。
      3.产品(Product)角色:该角色是建造中的复杂对象,一个系统中会有多个产品类,这些产品类并不一定有共同的接口,可以是完全不相关联的。
      4.导演者(Director)角色:该角色负责安排已有模块的顺序,然后告诉Builder开始建造。

    /**
     * 抽象建造者角色(Builder)
     * 规范产品的组成部分
     */
    public abstract class Builder {
        //设置产品的部分部分,以获得不同的产品
        public abstract void setPart1();
        public abstract void setPart2();
        public abstract void setPart3();
        //...更多部件限制
        //建造产品
        public abstract Product builderProduct();
    }
    
    /**
     * 具体建造者(Concrete Builder)
     * 实现建造者中定义的方法,并且返回一个组建好的产品实例.
     */
    public class ConcreteBuilder extends Builder {
        private Product product = new Product();
        //设置产品零件
        @Override
        public void setPart1() {
            //为product产品安装部件1
        }
        @Override
        public void setPart2() {
            //为product产品安装部件2
        }
        @Override
        public void setPart3() {
            //为product产品安装部件3
        }
        //...其他部件
        //建造一个产品
        @Override
        public Product builderProduct() {
            return product;
        }
    }
    
    /**
     * 产品角色(Product)
     * 一个建造者模式可以有多个产品,并且可以是完全不相关联的
     */
    public class Product {
        //产品类的业务处理方法
    }
    
    /**
     * 导演者角色(Director)
     * 负责调用具体建造者的方法,告诉Builder开始建造
     */
    public class Director {
        private Builder builder = new ConcreteBuilder();
        //构造产品,负责调用各个零件构造方法
        public Product build(){
            builder.setPart1();
            builder.setPart2();
            builder.setPart3();
            //...其他部件
            return builder.builderProduct();
        }
    }

    源码

    建造者模式的优点

      1.封装性,使用建造者模式可以使客户端不必知道产品内部组成的细节。
      2.建造者独立,容易拓展。
      3.便于控制细节风险。由于具体的建造者是独立的,因此可以对建造过程逐步细化,而不对其他模块产生任何影响。

    建造者模式的使用场景

      1.当采用相同的方法,不同的执行顺序,产生不同的结果时,可以采用建造者模式实现。
      2.多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时,则可以使用该模式。
      3.当产品类非常复杂,或者产品类中的方法调用顺序不同产生了不同的效能时,使用建造者模式。
      4.当在对象创建过程中会使用到系统的一些其他对象,而这些对象在产品的创建过程中不易得到时,也可以采用建造者模式封装该对象的创建过程。这种场景只能是一个补偿方法,因为一个对象不容易获得,而在设计阶段没有发现,却要通过建造者封装创建过程,本身已经违反设计的最初目标。

    建造者模式关注的是零件类型和转配工艺顺序,这是它与工厂方法模式最大的不同之处,虽然同为创建类模式,但是重点不同。

    /**
     * 抽象产品类
     * 共同的数据类型,继承用
     */
    public abstract class CellPhone {
        private String cpu;    //CPU型号
        private String ram;    //内存
        private String screen;    //屏幕
        private String battery;    //电池
        private String facade;    //外观
        private String others;    //其他部件
    }
    
    /**
     * Mate7产品类,基本数据类型由继承父类来
     */
    public class Mate7 extends CellPhone{
        public Mate7() {
            System.out.println("这是华为Meta7手机");
        }
        
        public String toString(){
            return "配置
    CPU:"+this.getCpu()+"
    内存:"+this.getRam()+"
    屏幕大小:"
                    +this.getScreen()+"
    电池容量:"+this.getBattery()+"
    外观:"
                    +this.getFacade()+"
    其他功能:"+this.getOthers();
        }
    }
    
    /**
     * Mate7产品类,基本数据类型由继承父类来
     */
    public class Mx4Pro extends CellPhone {
        public Mx4Pro() {
            System.out.println("这是华为Mx4Pro手机");
        }
        
        public String toString(){
            return "配置
    CPU:"+this.getCpu()+"
    内存:"+this.getRam()+"
    屏幕大小:"
                    +this.getScreen()+"
    电池容量:"+this.getBattery()+"
    外观:"
                    +this.getFacade()+"
    其他功能:"+this.getOthers();
        }
    }
    
    
    /**
     * 抽象建造者(Builder)
     * 规范手机的各个组成部分,具体如何组成由具体实现类决定
     */
    public interface CellPhoneBuilder {
        public void buildCPU();
        public void buildRAM();
        public void buildScreen();
        public void buildBattery();
        public void buildFacade();
        public void buildOthers();
        public CellPhone getPhone();
    }
    
    /**
     * Mate7具体建造者(Concrete Builder)
     * 实现抽象建造者方法
     */
    public class Mate7Build implements CellPhoneBuilder {
        CellPhone mate7 = new Mate7();
        @Override
        public void buildCPU() {
            mate7.setCpu("华为研发的芯片");
        }
    
        @Override
        public void buildRAM() {
            mate7.setRam("3G内存");
        }
    
        @Override
        public void buildScreen() {
            mate7.setScreen("六寸高清屏");
        }
    
        @Override
        public void buildBattery() {
            mate7.setBattery("4100毫安大容量电池");
        }
    
        @Override
        public void buildFacade() {
            mate7.setFacade("琥珀金");
        }
    
        @Override
        public void buildOthers() {
            mate7.setOthers("后背指纹识别");
        }
    
        @Override
        public CellPhone getPhone() {
            return mate7;
        }
    
    }
    
    /**
     * Mx4Pro具体建造者(Concrete Builder)
     * 实现抽象建造者方法
     */
    public class Mx4ProBuild implements CellPhoneBuilder{
        CellPhone mx4 = new Mx4Pro();
        @Override
        public void buildCPU() {
            mx4.setCpu("三星的CPU");
        }
    
        @Override
        public void buildRAM() {
            mx4.setRam("3G内存");
        }
    
        @Override
        public void buildScreen() {
            mx4.setScreen("五点五寸2K高清屏");
        }
    
        @Override
        public void buildBattery() {
            mx4.setBattery("3300毫安大容量电池");
        }
    
        @Override
        public void buildFacade() {
            mx4.setFacade("土豪金");
        }
    
        @Override
        public void buildOthers() {
            mx4.setOthers("360度指纹识别");
        }
    
        @Override
        public CellPhone getPhone() {
            return mx4;
        }
    }
    
    
    
    /**
     * 导演者(Director)
     * 负责安排构建的顺序
     */
    public class CellPhoneDirector {
        private CellPhoneBuilder cellPhoneBuilder = null;
        
        public Mate7 buildMate7() {
            cellPhoneBuilder = new Mate7Build();
            cellPhoneBuilder.buildCPU();
            cellPhoneBuilder.buildRAM();
            cellPhoneBuilder.buildScreen();
            cellPhoneBuilder.buildBattery();
            cellPhoneBuilder.buildFacade();
            cellPhoneBuilder.buildOthers();
            return (Mate7) cellPhoneBuilder.getPhone();
        }
        
        public Mx4Pro buildMx4Pro(){
            cellPhoneBuilder = new Mx4ProBuild();
            cellPhoneBuilder.buildCPU();
            cellPhoneBuilder.buildRAM();
            cellPhoneBuilder.buildScreen();
            cellPhoneBuilder.buildBattery();
            cellPhoneBuilder.buildFacade();
            cellPhoneBuilder.buildOthers();
            return (Mx4Pro) cellPhoneBuilder.getPhone();
        }
    }
    
    
    /**
     * 测试类,直接调用导演类获得实例,内部如何建造对外封装
     */
    public class CellPhoneDemo {
        public static void main(String[] args) {
            CellPhoneDirector director = new CellPhoneDirector();
            System.out.println("构建Mate7");
            Mate7 mate7 = director.buildMate7();
            System.out.println(mate7);    //查看详情
            System.out.println("构建Mx4Pro");
            Mx4Pro mx4Pro = director.buildMx4Pro();
            System.out.println(mx4Pro);    //查看详情
        }
    
    }

    源码

  • 相关阅读:
    必须克服的10种不良阅读习惯
    如何提升你的影响力
    爱情在线:拥抱变化的男女爱情!
    时间与生命
    女子最钟爱的五种男人
    社交常用表达:把人家的名字给忘了怎么办?
    最常用英语口头禅[推荐]
    中秋节的来历
    学会欣赏自己
    转帖]白领:4大行业通往高薪之路
  • 原文地址:https://www.cnblogs.com/aeolian/p/7846928.html
Copyright © 2020-2023  润新知