设计模式--创建型模式简介及总结
来源:互联网 发布:阿里云购买云服务器 编辑:程序博客网 时间: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 形式)。所以,我觉得创建型模式的本质是改变了我们创建对象的方式,让我们不能随意的创建对象,必须按照特定的约束来创建。
- 设计模式--创建型模式简介及总结
- 设计模式学习总结一原则及创建型模式
- 设计模式---创建型设计模式总结
- 创建型设计模式总结
- 创建型设计模式总结
- 设计模式:创建型总结
- 创建型设计模式总结
- 设计模式学习总结-创建型模式
- 设计模式-创建型模式总结
- 设计模式总结—创建型模式
- 【设计模式基础】创建型模式 - 总结
- 设计模式大总结-创建型模式
- 设计模式总结之创建型模式
- 设计模式大总结-创建型模式
- 【大话设计模式】--创建型模式总结
- 设计模式(6) - 创建型模式总结
- 【设计模式】--创建型模式总结
- 【设计模式】创建型模式总结
- SQL Server数据库有三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢复模式
- 文件上传 spring MVC
- Know More About LC And SC Fiber Patch Cable
- 文件上传(多文件)
- 洛谷 P1198 [JSOI2008]最大数
- 设计模式--创建型模式简介及总结
- Spring 使用注解的方式实现IOC和DI(控制反转和依赖注入)
- android studio多项目引用同一Module
- (实验)Java一个线程用synchronized嵌套锁多个对象时调用wait()只释放wait函数关联的所对象还是释放所有锁对象
- Python相关基础
- 计算某年某月某日是该年的第几天【算法入门】
- 栈的存储结构和应用
- layui
- MIPS汇编练习