zoukankan      html  css  js  c++  java
  • 构造者模式

    构造者模式

    先复制粘贴一下构造者模式的定义:

    Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。

    构造者有四种角色组成:

     Builder:是为创建一个Product对象的各个部件指定的抽象接口
     ConcreteBuilder:它是具体的构建者,实现Builder接口,构造和装配各个部件。
     Product:具体的产品
     Director:指挥者,它是构建一个使用Builder接口的对象。

    估计很多同学都没看懂,好啦,那我们先不管那么多的定义,我们先来讲一个故事吧,故事的内容就是一个土财主盖房子的事情。

    -------------------------------------------第一阶段——添加product角色(House.java)---------------------

    首先有个财主,他叫main,他想盖一座房子,名曰House.java(如下)

    package builder01;

     

    public class House {

        //地板

        private String floor = null;

        //墙

        private String wall = null;

        //屋顶

        private String housetop = null;

       

        public String getFloor() {

           return floor;

        }

       

        public void setFloor(String floor) {

           this.floor = floor;

        }

       

        public String getWall() {

           return wall;

        }

       

        public void setWall(String wall) {

           this.wall = wall;

        }

       

        public String getHousetop() {

           return housetop;

        }

       

        public void setHousetop(String housetop) {

           this.housetop = housetop;

        }

       

    }

    好了,下面,财主要自己盖房子了(代码如下)

    package builder01;

     

    public class MainClass {

     

        public static void main(String[] args) {

           //客户直接造房子

           House house = new House();

           house.setFloor("地板");

           house.setWall("墙");

           house.setHousetop("屋顶");

        }

     

    }

    -----------第二阶段—添加Builder(HouseBuilder.java)与ConcreteBuilder(BungalowBuilder.java)角色---------------------------------

    OK,我们看见整个过程都没问题 ,但是堂堂一个财主,自己去盖房子,貌似有点不太体面,所以这个时候需要一个施工队(HouseBuilder.java),

    package builder02;

     

    public interface HouseBuilder {

        //修地板

        public void makeFloor();

        //修墙

        public void makeWall();

        //修屋顶

        public void makeHousetop();

       

        public House getHouse();

    }

    然而HouseBuilder只是个接口,纯粹是个称谓,要盖房子还要找具体的施工队(盖平房的 施工队)

    BungalowBuilder.java:

    package builder02;

     

    public class BungalowBuilder implements HouseBuilder {

        House  house = new House();

        @Override

        public void makeFloor() {

           house.setFloor("平房-->地板");

        }

     

        @Override

        public void makeWall() {

           house.setWall("平房-->墙");

        }

     

        @Override

        public void makeHousetop() {

           house.setHousetop("平房-->房顶");

        }

     

        @Override

        public House getHouse(){

           return house;

        }

    }

    好了,施工队找好之后,财主只需要指挥平房施工队来建造房子就可以了

    package builder02;

     

    public class MainClass {

     

        public static void main(String[] args) {

           //由工程队来修房子

           HouseBuilder builder = new BungalowBuilder();

           //调用工程队来修

           builder.makeFloor();

           builder.makeHousetop();

           builder.makeWall();

           House house = builder.getHouse();

          

           System.out.println(house.getFloor());

           System.out.println(house.getHousetop());

           System.out.println(house.getWall());

        }

     

    }

    但是心细的同学可能发现了,虽然财主不用自己造平房了,但是财主需要自己指挥平房施工队来建造房子,这任务依然不轻松……这个时候财主就在想,要是有一个大管家来帮他指挥,那样的话岂不是方便很多!所以下面我们就把这个大管家给请过来:

    -------------第四阶段——添加Director(HouseDirector.java)角色-----------

    package builder04;

     

    public class HouseDirector {

        public void makeHouse(HouseBuilder houseBuilder){

           houseBuilder.makeFloor();

           houseBuilder.makeHousetop();

           houseBuilder.makeWall();

        }

    }

    其他的不变,这个时候财主要建造房子,只需要跟大管家(HouseDirector.java)说一声就可以了,代码如下:

    package builder04;

     

    public class MainClass {

        //直接在makeHouse中传houseBuilder的值,也是比较规范的

        public static void main(String[] args) {

           //建造平房

           //由工程队来修

           HouseBuilder houseBuilder = new BungalowBuilder();

           //设计者来做

           HouseDirector houseDirector = new HouseDirector();

           houseDirector.makeHouse(houseBuilder);

          

          

           House house = houseBuilder.getHouse();

          

           System.out.println(house.getFloor());

           System.out.println(house.getHousetop());

           System.out.println(house.getWall());

                 

        }

     

    }

    OK,到此,财主建造房子的故事算是正式讲完了,其中构造者模式的每一个角色也都比较详细的跟大家介绍清楚了,so,再回头对照着原始的定义,好好地回顾一下吧~

  • 相关阅读:
    卡顿检测
    FPS检测
    当检测到慢函数时,会在后台线程完成慢函数的分析
    慢函数检测
    对于没有复现onWindowFocusChange方法的Activity子类,插入一个onWindowFocusChange方法
    将totalCost用insurance的set方法set到保险总费用的字段中,然后进行插入操作。代码如下
    XML基础学习02<linq to xml>
    XML基础学习01
    Ajax学习记录
    数据迁移
  • 原文地址:https://www.cnblogs.com/magicy/p/4631788.html
Copyright © 2011-2022 走看看