天天看点

设计模式--创建型模式简介及总结

1 前言

创建行模式主要就是将类或者对象的实例化过程抽象起来,分为类的创建型模式,对象的创建型模式

2 创建型模式分类

创建型模式一般分为两大类,类创建型模式,对象创建型模式

对象创建型模式:

对象创建型模式主要有以下几大类。

抽象工厂:提供创建一组或者一系列相关的或相互依赖对象的接口。

Builder: 将复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示

原型模式:用原型实例对象指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象

单例模式:保证一个类仅有一个实例,并提供一个全局访问他的全局访问点。

1 抽象工厂

定义:提供创建一组或者一系列相关的或相互依赖对象的接口。

UML:

设计模式--创建型模式简介及总结

其中,ProductA和ProductB是相互有关系的产品或者类

适用场景:

1 一个系统中有多个产品系列时。需要选择一个产品系列,例如Android中主题(字体,图标,配色等都是一系列相关的产品)

2 要提供一组相关的产品时,或者要提供多个不同类别产品时

示例:

暂无

注意事项:

抽象产品的本质是对外提供多个不同种类的产品(这些产品最好有有关联或者联系),当有这种需求时优先考虑这种设计模式,至于工厂提供的方法的产品是否一定要抽象类,个人觉得不一定非要抽象类。

2 Builder

定义:将复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示

UML:

设计模式--创建型模式简介及总结

适用场景:

1 当创建对象的复杂算法(过程)应该独立于对象的组成部分及装配方式时,其实就是创建对象的过程与对象本身要独立

2 同一个构造过程可以创建不同的对象时

示例:

HTTP请求构造Request

/**
 * @author Created by qiyei2015 on 2017/10/21.
 * @version: 1.0
 * @email: [email protected]
 * @description: https请求
 */
public class HttpRequest<T> {
    /**
     * GET请求
     */
    public static final String GET = HTTP.GET;

    /**
     * POST 请求
     */
    public static final String POST = HTTP.POST;

    /**
     * DOWNLOAD 下载文件请求
     */
    public static final String DOWNLOAD = HTTP.DOWNLOAD;

    /**
     * UPLOAD 上传文件请求
     */
    public static final String UPLOAD = HTTP.UPLOAD;

    /**
     * Http请求方式
     */
    private String mMethod;
    /**
     * 基础url,为了应对微服务有多个基础url
     */
    private String mBaseUrl;
    /**
     * 请求的路径url,完整 mBaseUrl + mPathUrl
     */
    private String mPathUrl;
    /**
     * 请求的Header参数
     */
    private Map<String,String> mHeaderMap;
    /**
     * 请求体,外部传入
     */
    private T mBody;
    /**
     * 文件上传,文件下载的路径
     */
    private String mFilePath;
    /**
     * 是否缓存
     */
    private boolean isCache;

    /**
     * retrofit等使用的接口类
     */
    private Class<?> mApiClazz;

    /**
     * Http请求构造函数
     */
    private HttpRequest(){
        mHeaderMap = new HashMap<>();
        isCache = true;
        mBody = null;
    }


    /**
     * build设计模式
     */
    public static class Builder<T>{
        /**
         * HttpRequest引用
         */
        HttpRequest request;

        /**
         * Builder的构造方法
         */
        public Builder(){
            request = new HttpRequest();
            //默认为GET请求
            get();
        }

        /**
         * 设置GET请求
         * @return 当前对象
         */
        public Builder get(){
            request.mMethod = GET;
            return this;
        }

        /**
         * 设置POST请求
         * @return 当前对象
         */
        public Builder post(){
            request.mMethod = POST;
            return this;
        }

        /**
         * 设置DOWNLOAD请求
         * @return 当前对象
         */
        public Builder download(){
            request.mMethod = DOWNLOAD;
            return this;
        }

        /**
         * 设置UPLOAD请求
         * @return 当前对象
         */
        public Builder upload(){
            request.mMethod = UPLOAD;
            return this;
        }

        /**
         * @param baseUrl the {@link #mBaseUrl} to set
         * @return 当前对象
         */
        public Builder setBaseUrl(String baseUrl) {
            request.mBaseUrl = baseUrl;
            return this;
        }

        /**
         * @param pathUrl the {@link #mPathUrl} to set
         * @return 当前对象
         */
        public Builder setPathUrl(String pathUrl) {
            request.mPathUrl = pathUrl;
            return this;
        }

        /**
         * @param headerMap the {@link #mHeaderMap} to set
         * @return 当前对象
         */
        public Builder setHeaderMap(Map<String, String> headerMap) {
            request.mHeaderMap = headerMap;
            return this;
        }

        /**
         * @param body the {@link #mBody} to set
         * @return 当前对象
         */
        public Builder setBody(T body) {
            request.mBody = body;
            return this;
        }

        /**
         * @param filePath the {@link #mFilePath} to set
         * @return 当前对象
         */
        public Builder setFilePath(String filePath) {
            request.mFilePath = filePath;
            return this;
        }

        /**
         * @param cache the {@link #isCache} to set
         * @return 当前对象
         */
        public Builder setCache(boolean cache) {
            request.isCache = cache;
            return this;
        }

        /**
         * @param apiClazz the {@link #mApiClazz} to set
         * @return 当前对象
         */
        public Builder setApiClazz(Class<?> apiClazz) {
            request.mApiClazz = apiClazz;
            return this;
        }

        /**
         * 创建HttpRequest
         * @return
         */
        public HttpRequest build(){
            return request;
        }

    }

    /**
     * @return {@link #mMethod}
     */
    public String getMethod() {
        return mMethod;
    }

    /**
     * @return {@link #mBaseUrl}
     */
    public String getBaseUrl() {
        return mBaseUrl;
    }

    /**
     * @return {@link #mPathUrl}
     */
    public String getPathUrl() {
        return mPathUrl;
    }

    /**
     * @return {@link #mHeaderMap}
     */
    public Map<String, String> getHeaderMap() {
        return mHeaderMap;
    }

    /**
     * @return {@link #mBody}
     */
    public T getBody() {
        return mBody;
    }

    /**
     * @return {@link #mFilePath}
     */
    public String getFilePath() {
        return mFilePath;
    }

    /**
     * @return {@link #isCache}
     */
    public boolean isCache() {
        return isCache;
    }

    /**
     * @return {@link #mApiClazz}
     */
    public Class<?> getApiClazz() {
        return mApiClazz;
    }

}
           

注意事项:

Builder模式的本质是代替构造方法创建对象,一般适合创建对象的参数较多的情况,这种创建对象的方式灵活度要求较高(可对参数进行配置)。这种方式一旦创建好了对象,可以对对象中的参数进行只读保护。所以有这种需求的场景优先考虑。

Builder中可以保持对源对象的引用或者拥有相同的参数。以便创建源对象。

3 原型模式

定义:用原型实例对象指定创建对象的种类,并且通过拷贝这些原型对象创建新的对象

UML:

设计模式--创建型模式简介及总结

适用场景:

1 当一个系统应该独立于它的产品的创建,构成和表示时

示例:

暂无

注意事项:

原型模式暂时没用过,等用到了再补上

4 单例模式

定义:保证一个类仅有一个实例,并提供一个全局访问他的全局访问点。

UML:

暂时不画

适用场景:

在全局中只需要有一个实例对象的场景,一般用于创建这个对象需要耗费大量系统资源,或者全局一个对象便于访问的场景

示例:

太多了, 暂时不举例了

注意事项:

注意单例的写法,需要考虑到线程同步。

类创建型模式

类创建型模式主要是工厂方法这一个模式

5 工厂方法

定义:定义一个用于创建对象(产品)的接口,由子类决定实例化那个类的对象(产品)。

UML:

设计模式--创建型模式简介及总结

适用场景:

1 当一个类不知道它所创建的产品的具体是哪个子类时

2 当创建的对象的过程希望延缓到子类中进行时

示例:

暂无

注意事项:

1 注意,工厂方法是创建类的模式,由子类决定实例化那个类的对象,因此需要和抽象工厂区分

2 工厂方法可以退化为简单工厂或者静态工厂模式

简单工厂模式的UML如下:

设计模式--创建型模式简介及总结

3 创建新模式对比

1 创建型模式的本质(核心)是什么?

创建型模式是对常规new创建对象化的一种改变。一般在java中,我们创建对象都是直接new,但是创建型模式为我们提供几种不用new的形式来创建对象(本质上仍然是new 形式)。所以,我觉得创建型模式的本质是改变了我们创建对象的方式,让我们不能随意的创建对象,必须按照特定的约束来创建。

继续阅读