• 设计模式之建造者模式


    背景:需要建造一个房子,建造的房子过程有打地基、砌墙、封顶。建造的类型有普通的房子、高楼。

    思路:需要有一个抽象类,里面有建造房子过程的三个方法,然后具体类继承这个抽象类。

    关系图如下:

     代码实现如下:

    AbstractHouse.java

    public abstract class AbstractHouse {
        public abstract void buildBasic();
        public abstract void buildWalls();
        public abstract void roofed();
        public AbstractHouse(){
            buildBasic();
            buildWalls();
            roofed();
        }
    }

    CommonHouse.java

    public class CommonHouse extends AbstractHouse{
        @Override
        public void buildBasic() {
            System.out.println("CommonHouse 建造地基");
        }
    
        @Override
        public void buildWalls() {
            System.out.println("CommonHouse 建造墙");
        }
    
        @Override
        public void roofed() {
            System.out.println("CommonHouse 建造房顶");
        }
    }

    Client:

    public class Client {
        public static void main(String[] args) {
            CommonHouse commonHouse = new CommonHouse();
        }
    }

    优点:代码十分好理解,简单实现。

    缺点:这种做法把产品(即房子)和创建产品的过程(建房子流程)封装在一起,耦合性随之增强。

    引入建造者模式,把创建的对象和创建的过程分离。

    建造者模式的四个角色:

    Product: 一个具体的产品对象

    Builder:创建一个Product对象的各个部件指定的接口。

    ConcreteBuilder:实现接口,构建和装配各个部件。

    Director:构建一个使用builder接口的对象。它主要是用于创建一个复杂的对象。它主要有两个作用,一是:隔离了客户与对象的生产过程。二是:负责控制产品对象的生产过程。

    类图:

    House.java (产品)

    public class House {
        private String basic;
        private String wall;
        private String roof;
    
        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 getRoof() {
            return roof;
        }
    
        public void setRoof(String roof) {
            this.roof = roof;
        }
    }

     HouseBuilder.java (聚合一个House,把建造过程抽象出来)

    public abstract class HouseBuilder {
        protected House house = new House();
        public abstract void buildBasic();
        public abstract void buildWall();
        public abstract void buildRoof();
        public  House buildHouse(){
            return house;
        }
    }

    CommonHouse.java (实现houseBuilder中抽象方法)

    public class CommonHouse extends HouseBuilder{
    
        @Override
        public void buildBasic() {
            System.out.println("普通房子打地基");
        }
    
        @Override
        public void buildWall() {
            System.out.println("普通房子砌墙");
        }
    
        @Override
        public void buildRoof() {
            System.out.println("普通房子盖屋顶");
        }
    }

    HouseDirector.java (聚合一个具体的builder,进行创建房子)

    public class HouseDirector {
        HouseBuilder houseBuilder = null;
        public HouseDirector(HouseBuilder houseBuilder){
            this.houseBuilder = houseBuilder;
        }
        public House constructHouse(){
            houseBuilder.buildBasic();
            houseBuilder.buildWall();
            houseBuilder.buildRoof();
            return houseBuilder.buildHouse();
        }
    }

    Client.java

    public class Client {
        public static void main(String[] args) {
            CommonHouse commonHouse = new CommonHouse();
            HouseDirector houseDirector = new HouseDirector(commonHouse);
            House house = houseDirector.constructHouse();
        }
    }

    output:

    普通房子打地基
    普通房子砌墙
    普通房子盖屋顶

    建造者模式适用场景:建造者模式所创建的产品一般具有较多的共同点其组成部分相似,如果产品之间的差异很大,则不适合使用建造者模式,因此其使用范围受到一定的限制。如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。

  • 相关阅读:
    live555学习之RTSP连接建立以及请求消息处理过程
    RTSP协议学习笔记
    RTP头结构解析
    Doubango ims 框架 分析之 多媒体部分
    VMware虚拟机 NAT模式 配置静态ip
    计算机网络: IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解
    VMWare VMNet 8 的配置使用
    VMware虚拟机CentOS7
    如何禁止虚拟机自动获取DHCP分配的ip地址
    Linux之VMware虚拟机取消DHCP
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/12433656.html
一二三 - 开发者的网上家园