首先,在创建型模式中,包括了以下几种设计模式:
关于单例模式的实现,本专栏专门有一篇文章讲解单例模式常见的七种写法,这里就不再附代码了,点击查看
//User:实现Cloneable接口,重写clone()方法
public class User implements Cloneable {
private String username;
private Integer age;
/**
* 再创建一个人,赋予我的所有属性
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
User user = new User();
user.setUsername(username);
user.setAge(age);
return user;
}
}
public class Mebatis {
//缓存user
private Map<String,User> userCache = new HashMap<>();
//模拟从数据库查数据
public User getUser(String username) throws Exception {
User user = null;
//缓存中没有
if(!userCache.containsKey(username)){
//查询数据库
user = getUserFromDb(username);
}else {
//从缓存中直接拿,脏缓存问题
//原型已经拿到,但是不能直接给。
user = userCache.get(username);
System.out.println("从缓存中拿到的是:"+user);
//从这个对象快速得到一个克隆体(克隆人)==原型模式
user = (User) user.clone();
}
return user;
}
private User getUserFromDb(String username) throws Exception{
System.out.println("从数据库查到:"+username);
User user = new User();
user.setUsername(username);
user.setAge(18);
//给缓存中放一个clone
userCache.put(username, (User) user.clone());
return user;
}
}

/**
* 简单工厂
* 1、产品数量极少
*/
public class WuLinSimpleFactory {
public AbstractCar newCar(String type){
//核心方法:一切从简
if("van".equals(type)){
// 钣金、喷漆、放发动机、申请环保
return new VanCar();
}else if("mini".equals(type)){
return new MiniCar();
}
return null;//没有产品
}
}
/**
* 抽象的产品
*/
public abstract class AbstractCar {
String engine;
public abstract void run();
}
//具体产品
public class MiniCar extends AbstractCar{
public MiniCar(){
this.engine = "单引擎";
}
@Override
public void run() {
System.out.println(engine+"--> 发车...");
}
}
/**
* 具体产品
*/
public class VanCar extends AbstractCar{
public VanCar(){
this.engine = "双引擎";
}
@Override
public void run() {
System.out.println(engine+"-->发车");
}
}

/**
* 抽象工厂
*/
public abstract class AbstractCarFactory {
public abstract AbstractCar newCar();
//我能造什么.....
}
/**
* minicar分厂,具体的产品工厂,可以扩展添加
*/
public class WulinMinCarFactory extends AbstractCarFactory{
@Override
public AbstractCar newCar() {
return new MiniCar();
}
}
//具体的产品,有某一具体的工厂生产
public class MiniCar extends AbstractCar {
public MiniCar(){
this.engine = "迷你发动机";
}
@Override
public void run() {
System.out.println(engine+"--> 发车...");
}
}

/**
* 总集团规范,最上层抽象工厂,定义可以造啥
*/
public abstract class WulinFactory {
abstract AbstractCar newCar();
abstract AbstractMask newMask();
}
/**
* wulin 汽车子集团,只负责造汽车,口罩直接返回null
*/
public abstract class WulinCarFactory extends WulinFactory{
@Override
abstract AbstractCar newCar();
@Override
AbstractMask newMask() {
return null;
}
}
/**
* wulin口罩子集团,只负责造口罩,汽车直接返回null
*/
public abstract class WulinMaskFactory extends WulinFactory{
@Override
AbstractCar newCar() {
return null;
}
abstract AbstractMask newMask();
}
/**
* 抽象产品
*/
public abstract class AbstractCar {
String engine;
public abstract void run();
}
/**
* 抽象产品
*/
public abstract class AbstractMask {
Integer price;
public abstract void protectedMe();
}
//具体产品省略,代码太多了......
/**
* 口罩子集团建分厂:只造口罩,且武汉的厂只造N95口罩
*/
public class WulinWuHanMaskFactory extends WulinMaskFactory{
@Override
AbstractMask newMask() {
return new N95Mask();
}
}
/**
* 口罩子集团建分厂:只造口罩,且杭州的厂造普通外科口罩
*/
public class WulinHangZhouMaskFactory extends WulinMaskFactory {
@Override
AbstractMask newMask() {
return new CommonMask();
}
}
//汽车子集团建汽车各地分厂类似......
//我们想要定制的手机
@Getter
@ToString
public class Phone {
protected String cpu;
protected String mem;
protected String disk;
protected String cam;
}
/**
* 抽象建造者,定义我们定制化的参数,返回最终的手机
*/
public abstract class AbstractBuilder {
Phone phone;
abstract AbstractBuilder customCpu(String cpu);
abstract AbstractBuilder customMem(String mem);
abstract AbstractBuilder customDisk(String disk);
abstract AbstractBuilder customCam(String cam);
Phone getProduct(){
return phone;
}
}
//赋值后返回自己,方便链式调用
public class XiaomiBuilder extends AbstractBuilder{
public XiaomiBuilder(){
phone = new Phone();
}
@Override
AbstractBuilder customCpu(String cpu) {
phone.cpu = cpu;
return this;
}
@Override
AbstractBuilder customMem(String mem) {
phone.mem = mem;
return this;
}
@Override
AbstractBuilder customDisk(String disk) {
phone.disk = disk;
return this;
}
@Override
AbstractBuilder customCam(String cam) {
phone.cam = cam;
return this;
}
}
到这里,创建型的几种设计模式就学习完了,下一篇结构型设计模式…