• java设计模式-建造者模式


      第一次好好的看设计模式,可能有不对的地方,大佬们可以下面指出,感谢!

      ----------- 分割线 ----------

    UML图

    找了张网图,自己就不画了。

    作用

      可以将一个产品的内部表象与产品的生成过程分割开来,从而可以使一个建造过程生成具有不同的内部表象的产品对象。如果我们使用了建造者模式,那么用户就只需指定需要建造的类型就可以得到它们,而具体建造的过程和细节就可以不用知道了。

    使用场景

    1:当复杂对象需要与表示分离,可能需要创建不同的表示时;

    2:当需要向客户隐藏产品内部结构的表现时;

    今天拿开发一款软件产品为例:

    首先定义产品类

    @Data
    public class Product {
    
        private String proName;//产品名称
    
        private Date endDate;//产品研发结束时间
    
        private String demand;//产品需求
    
        private String model;//产品模型
    
        private List<String> tables;//产品数据表
    
        private String ui;//产品ui
    }

    定义产品的建造器

    public abstract class ProductBuilder {
    
        abstract void buildDemand();
    
        abstract void buildModel();
    
        abstract void buildui();
    
        abstract void buildTables();
    
        abstract void buildEndDate();
    
        abstract void showProduct();
    
    }

    定义指挥者

    public class Dircetor {
    
        private ProductBuilder productBuilder;
    
        public Dircetor(ProductBuilder productBuilder) {
            this.productBuilder = productBuilder;
        }
    
        public void startBuild() {
            productBuilder.buildDemand();
            productBuilder.buildModel();
            productBuilder.buildui();
            productBuilder.buildTables();
            productBuilder.buildEndDate();
        }
    
    }

    定义微博产品,实现产品建造器

    public class Weibo extends ProductBuilder {
    
        private Product product;
    
        public Weibo(){
            this.product = new Product();
            product.setProName("微博");
        }
    
        @Override
        void buildDemand() {
            System.out.println("开始制定微博需求");
            product.setDemand("微博需求:娱乐民众");
        }
    
        @Override
        void buildModel() {
            System.out.println("开始制定微博原型");
            product.setModel("这是微博的原型");
        }
    
        @Override
        void buildui() {
            System.out.println("开始制定微博UI图");
            product.setUi("这是微博的ui图");
        }
    
        @Override
        void buildTables() {
            System.out.println("开始制定微博数据库表");
            List<String> tables = Arrays.asList(new String[] {"table_a","table_b","table_c"});
            product.setTables(tables);
        }
    
        @Override
        void buildEndDate() {
            System.out.println("需求分析结束,制定项目研发最终日期");
            product.setEndDate(new Date());
        }
    
        @Override
        void showProduct() {
            System.out.println(JSON.toJSONString(product));
        }
    }

    程序调用

    public class Main {
    
        public static void main(String[] args){
            ProductBuilder weiboBuiler = new Weibo();
            Dircetor dircetor = new Dircetor(weiboBuiler);
            dircetor.startBuild();
            System.out.println("------------分割线--------------");
            weiboBuiler.showProduct();
        }
    
    }

    控制台输出

    开始制定微博需求
    开始制定微博原型
    开始制定微博UI图
    开始制定微博数据库表
    需求分析结束,制定项目研发最终日期
    ------------分割线--------------
    Disconnected from the target VM, address: '127.0.0.1:60596', transport: 'socket'
    {"demand":"微博需求:娱乐民众","endDate":1564390022604,"model":"这是微博的原型","proName":"微博","tables":["table_a","table_b","table_c"],"ui":"这是微博的ui图"}
    
    Process finished with exit code 0
  • 相关阅读:
    HDU 2149 Public Sale 博弈
    HDU 1850 Being a Good Boy in Spring Festival 博弈
    HDU 2176 取(m堆)石子游戏 博弈
    HDU 1517 A Multiplication Game 博弈
    HDU 2897 邂逅明下 博弈
    51nod 1445 变色DNA 最短路
    cocos creator中粒子效果的使用
    如何在cocos中为节点添加监听事件
    C++中STL常用容器的优点和缺点
    数据库链接池c3p0的配置
  • 原文地址:https://www.cnblogs.com/ghsy/p/11264949.html
Copyright © 2020-2023  润新知