美文网首页
建造者模式

建造者模式

作者: y三小石 | 来源:发表于2018-10-24 23:01 被阅读0次

一、定义

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

二、模板方法模式结构图

建造者
角色 类别 说明
Builder 接口或抽象类 抽象的建造者,不是必须的
ConcreateBuilder 具体的建造者 可以有多个「因为每个建造风格可能不一样」
Product 普通的类 具体的产品「即被建造的对象」
Director 导演也叫指挥者 统一指挥建造者去建造目标,导演不是必须的

三、模式的实现

public class Product {

    private List<String> parts = new ArrayList<>();
    public void addPart(String part) {
        parts.add(part);
    }

    public void showProduct() {
        for (String part : parts) {
            System.out.println(part);
        }
    }
}
public abstract class Builder {

    public abstract void buildPartA();

    public abstract void buildPartB();

    public abstract Product getResult();

}
public class ConcreteBuilderOne extends Builder {

    private Product product = new Product();
    @Override
    public void buildPartA() {
        product.addPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.addPart("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}


public class ConcreteBuilderTwo extends Builder {
    private Product product = new Product();

    @Override
    public void buildPartA() {
        product.addPart("部件A");
    }

    @Override
    public void buildPartB() {
        product.addPart("部件B");
    }

    @Override
    public Product getResult() {
        return product;
    }
}
public class Director {
    public void construct(Builder builder) {
        builder.buildPartA();
        builder.buildPartB();
    }
}
public static void main(String[] args) {
        Director director = new Director();
        Builder builderOne = new ConcreteBuilderOne();
        Builder builderTwo = new ConcreteBuilderTwo();

        director.construct(builderOne);
        Product p1 = builderOne.getResult();
        p1.showProduct();

        director.construct(builderTwo);
        Product p2 = builderTwo.getResult();
        p2.showProduct();
    }

四、使用的案例

dubbo 源码中获取内存cache的一段逻辑就是用了建造者模式,接着直接贴上源码对照着上面的四部分。
分析:构建cache都要先缓存到一个map中去,get的时候先从map获取,获取不到,在构建,然后放入map。整个流程是固定的,只是放入的Cache有多种。

Product

public interface Cache {

    void put(Object key, Object value);

    Object get(Object key);

}

public class LruCache implements Cache {
    
    private final Map<Object, Object> store;

    public LruCache(String url) {
        final int max = 1000;
        //TODO 1 LinkedHashMap可以做成lru格式的
        this.store = new LinkedHashMap<Object, Object>() {
            private static final long serialVersionUID = -3834209229668463829L;
            @Override
            protected boolean removeEldestEntry(Entry<Object, Object> eldest) {
                return size() > max;
            }
        };
    }

    @Override
    public void put(Object key, Object value) {
        synchronized (store) {
            store.put(key, value);
        }
    }

    @Override
    public Object get(Object key) {
        synchronized (store) {
            return store.get(key);
        }
    }

}

Builder

public abstract class AbstractCacheFactory implements CacheFactory {
    
    private final ConcurrentMap<String, Cache> caches = new ConcurrentHashMap<String, Cache>();

    @Override
    public Cache getCache(String url) {
        String key = url;
        Cache cache = caches.get(key);
        if (cache == null) {
            caches.put(key, createCache(url));
            cache = caches.get(key);
        }
        return cache;
    }

    protected abstract Cache createCache(String url);

}

ConcreteBuliderOne

public class LruCacheFactory extends AbstractCacheFactory {

    @Override
    protected Cache createCache(String url) {
        return new LruCache(url);
    }

}

ConcreteBuliderTwo

public class JCacheFactory extends AbstractCacheFactory {

    protected Cache createCache(URL url) {
        return new JCache(url);
    }

}
Director

public class Director {
    public Cache construct(AbstractCacheFactory abstractCacheFactory) {
       return abstractCacheFactory.getCache("cache");
    }
}

public class Director {
    public Cache construct(AbstractCacheFactory abstractCacheFactory) {
       return abstractCacheFactory.getCache("cache");
    }
}
public static void main(String[] args) {
        Director director = new Director();
        AbstractCacheFactory abstractCacheFactory = new LruCacheFactory();
        Cache cache = director.construct(abstractCacheFactory);
    }

四、建造者模式的特点

1、使创建产品的步骤「把创建产品步骤放在不同的方法中,更加清晰直观」和产品本身分离,即使用相同的创建过程要吧创建出不同的产品
2、每个建造者都是独立的互不影响,这样就达到解耦的目的,所以如果想要替换现有的建造者那非常方便,添加一个实现即可。

所以说,建造者模式实在创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式是使用的模式。

相关文章

  • Builder Pattern in Java

    建造者模式:建造者模式定义建造者模式应用场景实现案例Jdk中的建造者模式建造者模式的优点建造者模式的缺点 建造者模...

  • 设计模式(4) 建造者模式

    什么是建造者模式 经典建造者模式的优缺点 对建造者模式的扩展 什么是建造者模式 建造者模式将一个复杂的对象的构建与...

  • 建造者模式(部件构造)

    目录 建造者模式的理念 从 POJO 到建造者模式的思考 怎么来实现建造者模式 建造者模式在Android源码中的...

  • 【设计模式】之建造者Builder模式

    建造者模式 什么是建造者模式? 建造者模式属于创建型模式的一员,可以控制对象的实例化过程。建造者模式简化了复杂对象...

  • 建造者模式

    一、建造者模式介绍 二、建造者模式代码实例

  • 建造者模式

    建造者模式 首先,建造者模式的封装性很好。使用建造者模式可以有效的封装变化,在使用建造者模式的场景中,一般产品类和...

  • 建造者模式:深入理解建造者模式 ——组装复杂的实例

    目录: 一 建造者模式介绍 1.1 定义 1.2 为什么要用建造者模式(优点)? 1.3 哪些情况不要用建造者模式...

  • 设计模式之建造者模式

    设计模式之建造者模式 Intro 简介 建造者模式: 建造者模式隐藏了复杂对象的创建过程,它把复杂对象的创建过程加...

  • 一、设计模式(构建模式)——03建造模式与原型模式

    建造者模式 建造型模式用于创建过程稳定,但配置多变的对象。 建造模式的实现要点: 在建造者模式中,指挥者是直接与客...

  • 创建型模式:建造者模式

    个人公众号原文:创建型模式:建造者模式 五大创建型模式之四:建造者模式。 简介 姓名 :建造者模式 英文名 :Bu...

网友评论

      本文标题:建造者模式

      本文链接:https://www.haomeiwen.com/subject/bldftqtx.html