/设计模式之建造者模式与原型模式/
// 原型模式——简历代码 初步实现
//客户端调用代码
public class main3 {
public static void main(String[] args) {
Resume a=new Resume("大鸟");
a.SetPersonnalInfo("男", "29");
a.SetWorkExperience("1998-2000", "xx公司");
a.Display();
Resume b=a;
b.Display();
}
}
class Resume {
private String name;
private String sex;
private String timeArea;
private String age;
private String company;
public Resume(String name) {
this.name = name;
}
// 设置个人信息
public void SetPersonnalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
// 设置工作经历
public void SetWorkExperience(String timeArea, String company) {
this.timeArea = timeArea;
this.company = company;
}
// 显示
public void Display() {
System.out.println("姓名:"+ this.name+"\n"+"年龄:"+this.age+"\n"+"性别:"+this.sex);
System.out.println("工作年限:"+this.timeArea+"\n"+"公司:"+this.company);
}
}
//原型模式:用原型实例指定创建对象得种类,并且通过拷贝这些原型创建新的对象
//简单的原型实现——简历
public class main3 {
public static void main(String[] args) throws CloneNotSupportedException {
Resume a = new Resume("大鸟");
a.SetPersonnalInfo("男", "29");
a.SetWorkExperience("1998-2000", "xx公司");
a.Display();
Resume b = (Resume)a.Clone();
b.SetPersonnalInfo("女", "25");
b.SetWorkExperience("2020-2035", "互联网公司");
b.Display();
}
}
//简历
class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private String timeArea;
private String company;
public Resume(String name) {
this.name = name;
}
// 设置个人信息
public void SetPersonnalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
// 设置工作经历
public void SetWorkExperience(String timeArea, String company) {
this.timeArea = timeArea;
this.company = company;
}
// 显示
public void Display() {
System.out.println("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
System.out.println("工作年限:" + this.timeArea + "\n" + "公司:" + this.company);
}
public Object Clone() throws CloneNotSupportedException {
return super.clone();
}
}
简历的浅复制实现
public class main3 {
public static void main(String[] args) throws CloneNotSupportedException {
Resume a = new Resume("大鸟");
a.SetPersonnalInfo("男", "29");
a.SetWorkExperience("1998-2000", "xx公司");
a.Display();
Resume b=(Resume)a.Clone();
b.SetWorkExperience("2000-2020", "YY企业");
a.Display();
b.Display();
}
}
//工作经历
class WorkExperience {
private String workDate; // 工作时间
private String company; // 工作地点
// 设置工作时间
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
// 返回工作时间
public String getWorkDate() {
return this.workDate;
}
// 设置工作地点
public void setCompany(String company) {
this.company = company;
}
// 返回工作地点
public String getCompany() {
return this.company;
}
}
//简历
class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience work;
//在简历类实例化时同时实例化工作经历
public Resume(String name) {
this.name = name;
work= new WorkExperience();
}
// 设置个人信息
public void SetPersonnalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
//设置工作经历
public void SetWorkExperience(String workDate,String company) {
this.work.setWorkDate(workDate);
this.work.setCompany(company);
}
// 显示
public void Display() {
System.out.println("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
System.out.println("工作年限:" + this.work.getWorkDate() + "\n" + "公司:" + this.work.getCompany());
}
public Object Clone() throws CloneNotSupportedException {
return super.clone();
}
}
**
简历的深复制
**
public class main3 {
public static void main(String[] args) throws CloneNotSupportedException {
Resume a = new Resume("大鸟");
a.SetPersonnalInfo("男", "29");
a.SetWorkExperience("1998-2000", "xx公司");
Resume b = (Resume) a.Clone();
b.SetWorkExperience("2000-2020", "YY企业");
Resume c = (Resume) a.Clone();
c.SetPersonnalInfo("女", "19");
a.Display();
System.out.println();
b.Display();
System.out.println();
c.Display();
System.out.println();
}
}
//工作经历类
class WorkExperience implements Cloneable {
private String workDate; // 工作时间
private String company; // 工作地点
// 设置工作时间
public void setWorkDate(String workDate) {
this.workDate = workDate;
}
// 返回工作时间
public String getWorkDate() {
return this.workDate;
}
// 设置工作地点
public void setCompany(String company) {
this.company = company;
}
// 返回工作地点
public String getCompany() {
return this.company;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
//简历类
class Resume implements Cloneable {
private String name;
private String sex;
private String age;
private WorkExperience work;
// 在简历类实例化时同时实例化工作经历
public Resume(String name) {
this.name = name;
work = new WorkExperience();
}
// 设置个人信息
public void SetPersonnalInfo(String sex, String age) {
this.sex = sex;
this.age = age;
}
// 构造函数
private Resume(WorkExperience work) throws CloneNotSupportedException {
this.work = (WorkExperience) work.clone();
}
// 设置工作经历
public void SetWorkExperience(String workDate, String company) {
this.work.setWorkDate(workDate);
this.work.setCompany(company);
}
// 显示
public void Display() {
System.out.println("姓名:" + this.name + "\n" + "年龄:" + this.age + "\n" + "性别:" + this.sex);
System.out.println("工作年限:" + this.work.getWorkDate() + "\n" + "公司:" + this.work.getCompany());
}
public Object Clone() throws CloneNotSupportedException {
/*
* Resume obj=new Resume(this.work); obj.name=this.name; obj.sex=this.sex;
* obj.age=this.age; return obj;
*/
Resume resume = (Resume) super.clone();
resume.work = (WorkExperience) work.clone();
return resume;
}
}
- 从测试结果可以看出,这次给WorkExperience类添加clone函数之后, 修改原型对象的对象成员变量之后,克隆对象的对象成员变量没有发生改变,
- 因为这次是真正的克隆了一份数据,而不是一个引用。
- 原型模式应用场景:
- 1、在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。
- 2、希望对目标对象的修改不影响既有原型对象(深度克隆的时候完全互不影响)。
- 3、 隐藏克隆操作的细节,很多时候,对对象本身的克隆需要设计到类本身的数据细节。**
建造者模式——设计小人
建造者(Builder)模式的定义:指将一个复杂对象的构造与它的表示分离,使同样的构建过程可以创建不同的表示,这样的设计模式被称为建造者模式。
它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成。
它将变与不变相分离,即产品的组成部分是不变的,但每一部分是可以灵活选择的。
建造者模式主要包括以下角色:
1.产品:包含多个组件的复杂对象,各组件由建造者来创建。
2.抽象建造者(builder):一个包含创建产品各个子部件的抽象方法的接口,通常还包含一个返回复杂产品的方法 getResult()。
3.具体建造者ConcreteBuilder,建造者的具体实现,完成复杂产品的各个部件的具体创建方法。
4.指挥者Director:它调用建造者对象中的部件构造与装配方法完成复杂对象的创建,在指挥者中不涉及具体产品的信息。**
public class main3 {
public static void main(String[] args) {
PersonThinBuilder ptb=new PersonThinBuilder();
PersonDirector pd=new PersonDirector(ptb);
pd.CreatePerson();
}
}
abstract class PersonBuider {
public abstract void BuidHead();
public abstract void BuidBody();
public abstract void BuidArmLeft();
public abstract void BuidArmRight();
public abstract void BuidLegLeft();
public abstract void BuidLegRight();
}
class PersonThinBuilder extends PersonBuider{
public void BuidHead()
{
System.out.println("head");
}
public void BuidBody()
{
System.out.println("Body");
}
public void BuidArmLeft()
{
System.out.println("armleft");
}
public void BuidArmRight()
{
System.out.println("armright");
}
public void BuidLegLeft()
{
System.out.println("legleft");
}
public void BuidLegRight()
{
System.out.println("legright");
}
}
class PersonDirector
{
private PersonBuider pb;
public PersonDirector(PersonBuider pb)
{
this.pb = pb;
}
public void CreatePerson()
{
pb.BuidHead();
pb.BuidBody();
pb.BuidArmLeft();
pb.BuidArmRight();
pb.BuidLegLeft();
pb.BuidLegRight();
}
}