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