zoukankan      html  css  js  c++  java
  • 设计模式——建造者模式

    分类

    设计模式总体划分为三大类:

    创建型模式:工厂模式,抽象工厂模式,单例模式,建造者模式,原型模式模式,共5种。

    结构型模式:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式,共7中。

    行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式,共11种。

    建造者模式(生成器模式)

    GoF:建造者模式:是将一个复杂的对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。

    窝草,好抽象,那举个栗子吧

    某汽车生产车间,一号汽车装配线,将各种零件按照工序组装在一起,生产出来一种型号的汽车,零件一变,就生产出另一种型号的汽车了。

    建造者模式的本质:流程不变,但每个流程实现的具体细节则是经常变化的。

    建造者模式保证了程序流程不会变化,即不会增加、也不会遗漏或者产生流程次序错误

    建造者模式又叫生成器模式。

    组成部分

    Product:复杂产品对象。

    Builder:一个抽象接口,规范创建Product的组成成分。只暴露组成部分的创建接口,不涉及具体创建细节,依赖Product。

    ConcreteBuilder:实现Builder接口,完成Product各个组成部分的具体创建细节,依赖Product。

    Director:负责创建一个Product,依赖Builder,Product。

    代码示例

    Product:Person

    package cn.leo.demo.mode.creator;
    
    public class Person {
    	private String head;
    	private String body;
    	private String feet;
    	
    	public String getHead() {
    		return head;
    	}
    
    	public void setHead(String head) {
    		this.head = head;
    	}
    
    	public String getBody() {
    		return body;
    	}
    
    	public void setBody(String body) {
    		this.body = body;
    	}
    
    	public String getFeet() {
    		return feet;
    	}
    
    	public void setFeet(String feet) {
    		this.feet = feet;
    	}
    }
    

     Builder:PersonBuilder

    package cn.leo.demo.mode.creator;

    public interface PersonBuilder {
        void buildHead();
        void buildBody();
        void buildFeet();
        Person buildPerson();
    }

     ConcreteBuilder:ManBuilder,WomenBuilder

    package cn.leo.demo.mode.creator;

    public class ManBuilder implements PersonBuilder{
        private Person person;
        
        public ManBuilder(Person person) {
            this.person = person;
        }

        @Override
        public void buildHead() {
            person.setHead("强壮男人的Head");
        }

        @Override
        public void buildBody() {
            person.setHead("强壮男人的Body");
        }

        @Override
        public void buildFeet() {
            person.setHead("强壮男人的Feet");
        }
        
        @Override
        public Person buildPerson() {
            return this.person;
        }
    }
    package cn.leo.demo.mode.creator;

    public class WomenBuilder implements PersonBuilder{
        private Person person;
        
        public WomenBuilder(Person person) {
            this.person = person;
        }

        @Override
        public void buildHead() {
            person.setHead("温柔女人的Head");
        }

        @Override
        public void buildBody() {
            person.setHead("温柔女人的Body");
        }

        @Override
        public void buildFeet() {
            person.setHead("温柔女人的Feet");
        }

        @Override
        public Person buildPerson() {
            return this.person;
        }
    }

     Director:PersonDirector

    package cn.leo.demo.mode.creator;
    
    public class PersonDirector {
    	private PersonBuilder personBuilder;
    
    	public PersonDirector(PersonBuilder personBuilder) {
    		this.personBuilder = personBuilder;
    	}
    	
    	public Person buildPerson(){
    		personBuilder.buildHead();
    		personBuilder.buildBody();
    		personBuilder.buildFeet();
    		
    		return personBuilder.buildPerson();
    	}
    }
    

     ManBuilder,WomenBuilder实现了构造复杂对象Person各个组成部分的具体细节。

  • 相关阅读:
    JQuery封装的ajax
    DOM节点操作
    ES6中的let和const
    CSS cursor 属性
    ui-router 视图嵌套时指定二级视图显示默认页面
    数组去重的几种方法
    basic_consume() got multiple values for keyword argument 'queue'
    perl改造成bash---结果写入xml
    springmvc 启动报 java.lang.NoSuchMethodError: org.springframework.core.GenericTypeResolver.resolveTypeArguments(Ljava/lang/Class;Ljava/lang/Class;)[Ljava/lang/Class;
    web项目部署名和项目名不一致
  • 原文地址:https://www.cnblogs.com/seastar1989/p/7612062.html
Copyright © 2011-2022 走看看