您的位置:首页 > 产品设计 > UI/UE

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

2017-11-18 20:15 603 查看

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 形式)。所以,我觉得创建型模式的本质是改变了我们创建对象的方式,让我们不能随意的创建对象,必须按照特定的约束来创建。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息