设计模式系列
1、组合模式
2、策略模式
3、单例模式
4、原型模式
5、模板模式
6、观察者模式
7、享元模式
8、装饰着模式
9、门面模式
10、责任链模式
11、建造者模式
12、适配器模式
原型模式
什么是原型模式
现在有一个场景,就是好多查询或者业务处理,后端接受的参数都封装到一个对象中了,处理业务调用了不同的处理服务,每个处理的服务有可能会修改调参数对象中的值,那么每个服务就需要传一个新的参数参数对象过去,这个时候你需要没调用一个服务的时候创建一个新的参数对象出来,为了保证性能更好,就需要一个快速创建新对象并且值也一样,原型模式就是很好的选择,属于创建型模式。
简单的说,指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
码云地址:去看源码
示例
1、定义可以克隆的对象
一个类实现了 Cloneable 接口,就可以克隆了,是不是很简单。
/**
* 实现了 Cloneable 接口,就可以使用 Object 的 clone() 方法 克隆对象
*/
class ProductWithClone implements Cloneable{
private String name;
private int age;
private String address;
public ProductWithClone(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* jvm 实现了 对象 属性的复制
* @return
* @throws CloneNotSupportedException
*/
@Override
protected ProductWithClone clone() throws CloneNotSupportedException {
ProductWithClone product = (ProductWithClone) super.clone();
product.setName("acai copy");
return product;
}
}
2、测试
public class ProductWithCloneTest {
public static void main(String[] args) throws CloneNotSupportedException {
ProductWithClone product = new ProductWithClone("acai", 25, "earth");
//克隆一个对象出来
ProductWithClone product1 = product.clone();
System.out.println(product);
System.out.println(product1);
}
}
ProductWithClone{name=‘acai’, age=25, address=‘earth’}
ProductWithClone{name=‘acai copy’, age=25, address=‘earth’}
从结果可以看出,克隆了另一个对象。
打印出对象地址看一下:
com.example.pattern.prototype.ProductWithClone@1b6d3586
com.example.pattern.prototype.ProductWithClone@4554617c
product1 是 product 对象克隆出来的。
模板模式
什么是目标模式
定义一个算法骨架,将一些具体操作由子类实现,使得子类可以不改变算法或者流程的情况下改变具体实现步骤,大体流程是不变的,实现千变万化,比如说操作数据库的例子。
这种类型的设计模式属于行为型模式。
示例
1、定义一个抽象模板类
定义一个模板类出来,operator() 方法实现了基本业务逻辑,或者说是公共业务逻辑。
templateMethod 处理不同的情况。
public abstract class AbstractClass {
void operator(){
System.out.println("connect open");
System.out.println("pre init");
templateMethod();
templateMethodV2();
System.out.println("connect close");
}
/**
* 实现具体流程
*/
abstract void templateMethod();
abstract void templateMethodV2();
}
2、定义一个子类实现模板类
定义一个子类,继承模板类,并且重新了模板类提供可处理具体业务逻辑的方法。
public class SubClass extends AbstractClass{
@Override
void templateMethod() {
System.out.println("insert into table");
}
@Override
void templateMethodV2() {
System.out.println("update other tables");
}
}
3、测试
public class TemplateTest {
public static void main(String[] args) {
AbstractClass aClass = new SubClass();
aClass.operator();
}
}
connect open
pre init
insert into table
update other tables
connect close
这里假设了操作数据库的操作,首先 连接数据库操作,预处理是模板类中完成的, insert into table和 update other tables 是由子操作的,connect close又是模板类中完成的。