• 设计模式之建造者模式


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

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

    关系图如下:

     代码实现如下:

    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:

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

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

  • 相关阅读:
    与 字符串 相关的操作 -- lua语言实现(带有浓厚的 lua 语法特性)
    03-BFC
    11-canvas
    JavaScript知识点 思维导图
    文件系统 函数
    Meta标签大全
    PHP 快速排序
    天气预报API开发
    Zend Studio XDebug调试配置
    启程
  • 原文地址:https://www.cnblogs.com/chenmz1995/p/12433656.html
Copyright © 2020-2023  润新知