什么是原型模式
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
原型模式的核心就是一各clone方法
1)java中自带
2)实现原型模式需要实现标记型接口Cloneable
3)一般会重写clone()方法
4)如果只是重写clone()方法,而没有实现接口,调用时会报异常
5)一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,对象属性特别多
6)需要区分深克隆和浅克隆
/**
* 浅克隆
*/
public class Test {
public static void main(String[] args) throws Exception {
Person p1 = new Person();
Person p2 = (Person)p1.clone();
System.out.println(p2.age + " " + p2.score);
System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc);
p1.loc.street = "sh";
System.out.println(p2.loc);
}
}
class Person implements Cloneable {
int age = 8;
int score = 100;
Location loc = new Location("bj", 22);
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
class Location {
String street;
int roomNo;
@Override
public String toString() {
return "Location{" +
"street='" + street + '\'' +
", roomNo=" + roomNo +
'}';
}
public Location(String street, int roomNo) {
this.street = street;
this.roomNo = roomNo;
}
}
/**
* 深克隆的处理
*/
public class Test {
public static void main(String[] args) throws Exception {
Person p1 = new Person();
Person p2 = (Person)p1.clone();
System.out.println(p2.age + " " + p2.score);
System.out.println(p2.loc);
System.out.println(p1.loc == p2.loc);
p1.loc.street = "sh";
System.out.println(p2.loc);
}
}
class Person implements Cloneable {
int age = 8;
int score = 100;
Location loc = new Location("bj", 22);
@Override
public Object clone() throws CloneNotSupportedException {
Person p = (Person)super.clone();
p.loc = (Location)loc.clone();
return p;
}
}
//深克隆要求location也需要实现cloneable接口
class Location implements Cloneable {
String street;
int roomNo;
@Override
public String toString() {
return "Location{" +
"street='" + street + '\'' +
", roomNo=" + roomNo +
'}';
}
public Location(String street, int roomNo) {
this.street = street;
this.roomNo = roomNo;
}
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
Memento备忘录
记录状态,便于回滚
记录快照(瞬时状态)
存盘(java中的序列化)
TemplateMethod模板方法
钩子函数 回调函数
public class Main {
public static void main(String[] args) {
F f = new C1();
f.m();
}
}
abstract class F {
//定义好模板
public void m() {
op1();
op2();
}
abstract void op1();
abstract void op2();
}
class C1 extends F {
@Override
void op1() {
System.out.println("op1");
}
@Override
void op2() {
System.out.println("op2");
}
}
state状态模式
根据状态决定行为
//状态抽象类
public abstract class MMState {
abstract void smile();
abstract void cry();
abstract void say();
}
//状态1
public class MMSadState extends MMState {
@Override
void smile() {
}
@Override
void cry() {
}
@Override
void say() {
}
}
//状态2
public class MMNervousState extends MMState {
@Override
void smile() {
}
@Override
void cry() {
}
@Override
void say() {
}
}
//状态3
public class MMHappyState extends MMState {
@Override
void smile() {
System.out.println("happy smile");
}
@Override
void cry() {
}
@Override
void say() {
}
}