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

来源:互联网 发布:阿里云购买云服务器 编辑:程序博客网 时间:2024/06/11 00:37

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: 1273482124@qq.com * @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 形式)。所以,我觉得创建型模式的本质是改变了我们创建对象的方式,让我们不能随意的创建对象,必须按照特定的约束来创建。

原创粉丝点击