创建类模式
- 包含工厂方法模式、建造者模式、抽象工厂模式、单例模式和原型模式。他们可以提供对象的创建和管理职责。其中的单例模式和原型模式非常容易理解。单例模式是要保持在内存中只有一个对象。原型模式是要求通过复制的方法产生一个新的对象。
- 剩下的就是工厂方法模式、抽象工厂模式和建造者模式了, 这三个之间有较多的相似性。
工厂方法模式VS建造者模式
工厂方法模式:
- 抽象类方法
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:17
* Description: 超人抽象类
*/
public abstract class SuperMan {
//每个超人都有特殊的能力
public abstract void specialTalent();
}
- 成人超人继承能力超人抽象类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:22
* Description: 成年超人
*/
public class AdultSuperMan extends SuperMan {
@Override
public void specialTalent() {
System.out.println("超人力大无穷");
}
}
- 幼年超人继承超人抽象类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:23
* Description: 幼年超人
*/
public class ChildSuperMan extends SuperMan {
@Override
public void specialTalent() {
System.out.println("小超人的能力是刀枪不入、快速运动");
}
}
- 工厂模式入口类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:26
* Description:
*/
public class CreateSuperManFactory {
public static <T extends SuperMan> T createSuperMan(Class<T> c) {
SuperMan superMan = null;
try {
superMan = (SuperMan) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return (T) superMan;
}
}
- 工厂模式的调用类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:30
* Description:
*/
public class Client {
public static void main(String[] args) {
SuperMan superMan = CreateSuperManFactory.createSuperMan(AdultSuperMan.class);
superMan.specialTalent();
}
}
通过以上的方法可以创建一批批超人,包括幼年超人或者成年超人。当然这些超人都是一个样子。所以也就是说,工厂模式关注的是一个产品的整体,生产出的产品应该具有相似的功能和框架。
建造者模式
- 超人类的定义
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 15:58
* Description: 超人类的定义
*/
//该注解在这里不做详细介绍,可自行百度
@Data
public class SuperMan {
// 超人的躯体
private String body;
//超人的特殊技能
private String specialTalent;
//超人的标志
private String specialSymbol;
}
- 超人抽象构造者
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 16:01
* Description: 超人抽象构造者
*/
public abstract class Builder {
//定义一个超人应用
protected final SuperMan superMan = new SuperMan();
//构建出超人的躯体
public void setBody(String body) {
this.superMan.setBody(body);
}
//构建出超人的特殊技能
public void setSpecialTalent(String st) {
this.superMan.setSpecialTalent(st);
}
//构建出超人的特殊标记
public void setSpecialSymbol(String ss) {
this.superMan.setSpecialSymbol(ss);
}
//构建出一个完整的超人
public abstract SuperMan getSuperMan();
//一個超人的模版方法模式。超人的各个部分都准备好了。具体怎么组装则是由实现类来决定,
}
- 成年超人建造者
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 16:11
* Description:- 成年超人建造者
*/
public class AdultSuperManBuilder extends Builder {
@Override
public SuperMan getSuperMan() {
super.setBody("强壮的身体");
super.setSpecialTalent("会飞行");
super.setSpecialSymbol("胸前带S标记");
return super.superMan;
}
}
- 幼年超人建造者
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 16:14
* Description:
*/
public class ChilderSuperManBuilder extends Builder {
@Override
public SuperMan getSuperMan() {
super.setBody("strong body!");
super.setSpecialTalent("刀枪不入");
super.setSpecialSymbol("胸前带小S标记");
return super.superMan;
}
}
- 导演类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 16:18
* Description: 导演类
*/
public class Director {
public static <T extends Builder> SuperMan createBuilder(Class<T> c) {
Builder builder = null;
try {
builder = (Builder) Class.forName(c.getName()).newInstance();
} catch (Exception e) {
e.printStackTrace();
}
return builder.getSuperMan();
}
}
- 场景类
/**
* Author: 王蒙Sanm
* Date: 2019/5/25 16:22
* Description: 场景类
*/
public class ClientBuilder {
public static void main(String[] args) {
//成年超人信息
SuperMan superMan = Director.createBuilder(AdultSuperManBuilder.class);
System.out.println(superMan.toString());
//幼年超人信息
SuperMan childSuperMan = Director.createBuilder(ChilderSuperManBuilder.class);
System.out.println(childSuperMan.toString());
}
}
上述2个例子可以看出,工厂方法模式和建造者模式都属于对象创建类模式。均是用来创建类的对象。但他们之间的区别还是很明显的。
- 意图不同
- 工厂模式是一个对象创建的粗线条应用,建造者模式则是通过细线条勾勒出一个复杂对象, 关注的是产品组成部分的创建过程。
- 产品的复杂度不同
- 厂方法模式的对象粒度比较粗,建造者模式的产品对象粒度比较细。