【设计模式系列】--原型模式

在前面的博文中,小编介绍了设计模式的相关知识,今天这篇博文,咱们继续来学习设计模式的相关知识,今天小编向大家介绍的模式是原型模式,还请小伙伴多多指教,小编会从什么是原型设计模式、原型模式的结构图、原型模式的demo以及原型模式的特点和应用场景等方面一一进行介绍,希望对有需要的小伙伴有帮助。

什么是原型模式

原型模式英文名称叫Prototype,是一种创建型模式,她采用复制原型对象的方法来创建对象的实例,使用Prototype模式创建的实例,具有与原型一样的数据,我们来看一下原型模式的结构图,如下所示:


原型模式Demo

接着,小编结合相关的demo来进一步讲解原型模式,新建java项目Prototype,新建类Person,编写相关代码,如下所示:

public class Person {
	//姓名
	private String name;
	//年龄
	private int age;
	//性别
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	

}
新建MainClass类,编写相关代码,如下所示:

public class MainClass {
	public static void main(String[] args) {
		Person person1 = new Person();
		person1.setName("dingguohua");
		person1.setAge(22);
		person1.setSex("女");
		
		Person person2 = new Person();
		person2.setName("dingding");
		person2.setAge(20);
		person2.setSex("女");
	}

}
我们创建了两个对象,肯定是不相同的是不是,发现除了name,其她地方都相同,我们希望,不用在重复设置,person2呢等于person1,只是name不同,我想复制这个对象,这个时候,我们就可以使用原型模式,我们来看一下原型模式的特点:

a、由原型对象自身创建目标对象,也就是说,对象创建这一动作发自原型对象本身。

b、目标对象是原型对象的一个克隆,也就是说,通过原型模式创建的对象,不仅仅与原型对象具有相同的结构,还与原型对象具有相同的值。

c、根据对象克隆深度层次的不同,有浅度克隆和深度克隆。

结合demo,原型对象person1,目标对象person2,我们希望通过1创建2,java里面有一个接口叫做Cloneable,只有实现了这个接口,才能被克隆,所以,我们需要提供一个clone的方法,完善Person里面的代码,如下所示:

public class Person implements Cloneable  {
	//姓名
	private String name;
	//年龄
	private int age;
	//性别
	private String sex;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Person clone(){
		try{
			return (Person)super.clone();
		} catch (CloneNotSupportedException e){
			e.printStackTrace();
			return null;
		}
	}
	
	

}
编写MainClass里面的代码部分,如下所示:

public class MainClass {
	public static void main(String[] args) {
		Person person1 = new Person();
		person1.setName("dingguohua");
		person1.setAge(22);
		person1.setSex("女");
		
		Person person2 = person1.clone();
		
		System.out.println(person1.getName());
		System.out.println(person1.getAge());
		System.out.println(person1.getSex());
		
		
		System.out.println(person2.getName());
		System.out.println(person2.getAge());
		System.out.println(person2.getSex());
		
	}

}
运行,如下所示:


这样,就实现了我们的原型模式,接着,我们来看深度克隆和浅度克隆,什么是深度克隆和浅度克隆呢?比如我们在Person里面新添加一个属性,并且生成get和set方法,如下所示:

import java.util.List;


public class Person implements Cloneable  {
	//姓名
	private String name;
	//年龄
	private int age;
	//性别
	private String sex;
	//朋友
	private List<String> friends;
	
	public List<String> getFriends() {
		return friends;
	}
	public void setFriends(List<String> friends) {
		this.friends = friends;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Person clone(){
		try{
			return (Person)super.clone();
		} catch (CloneNotSupportedException e){
			e.printStackTrace();
			return null;
		}
	}
	
	

}
编写MainClass中的代码部分,如下所示:

import java.util.ArrayList;
import java.util.List;


public class MainClass {
	public static void main(String[] args) {
//		Person person1 = new Person();
//		person1.setName("dingguohua");
//		person1.setAge(22);
//		person1.setSex("女");
//		
//		Person person2 = person1.clone();
//		
//		System.out.println(person1.getName());
//		System.out.println(person1.getAge());
//		System.out.println(person1.getSex());
//		
//		
//		System.out.println(person2.getName());
//		System.out.println(person2.getAge());
//		System.out.println(person2.getSex());
		
		Person person1 = new Person();
		List<String> friends = new ArrayList<String>();
		friends.add("xiaodingding");
		friends.add("xiaoxiaoding");
		
		person1.setFriends(friends);
		Person person2 = person1.clone();
		
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
		
	}

}
运行代码,效果如下所示:


如果这个时候,再加上一个呢?完善代码,如下所示:

import java.util.ArrayList;
import java.util.List;


public class MainClass {
	public static void main(String[] args) {
//		Person person1 = new Person();
//		person1.setName("dingguohua");
//		person1.setAge(22);
//		person1.setSex("女");
//		
//		Person person2 = person1.clone();
//		
//		System.out.println(person1.getName());
//		System.out.println(person1.getAge());
//		System.out.println(person1.getSex());
//		
//		
//		System.out.println(person2.getName());
//		System.out.println(person2.getAge());
//		System.out.println(person2.getSex());
		
		Person person1 = new Person();
		List<String> friends = new ArrayList<String>();
		friends.add("xiaodingding");
		friends.add("xiaoxiaoding");
		
		person1.setFriends(friends);
		Person person2 = person1.clone();
		
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
		
		friends.add("xiaoding");
		person1.setFriends(friends);
		System.out.println(person1.getFriends());
		System.out.println(person2.getFriends());
		
	}

}
运行,如下所示:


这是一种浅度的克隆,那么怎么样才算是深度的克隆呢?完善Person的代码,如下所示:

import java.util.ArrayList;
import java.util.List;


public class Person implements Cloneable  {
	//姓名
	private String name;
	//年龄
	private int age;
	//性别
	private String sex;
	//朋友
	private List<String> friends;
	
	public List<String> getFriends() {
		return friends;
	}
	public void setFriends(List<String> friends) {
		this.friends = friends;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	
	public Person clone(){
		try{
			Person person =(Person)super.clone();
			List<String> newfriends = new ArrayList<String>();
			for(String friends :this.getFriends()){
				newfriends.add(friends);
			}
			person.setFriends(newfriends);
			return person;
		} catch (CloneNotSupportedException e){
			e.printStackTrace();
			return null;
		}
	}
	
	

}
运行,效果如下所示:


这样就是先了深度克隆,接着,我们来看一下原型模式应用的场景。

原型模式应用场景

a、在创建对象的时候,我们不只是希望被创建的对象继承其基类的基本结构,还希望继承原型对象的数据。

b、希望对目标对象的修改不影响既有的原型对象,深度克隆的时候可以完全互不影响。

c、隐藏克隆操作的细节,很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

小编寄语:该博文,小编主要简单的介绍了原型模式,从什么是原型模式,原型模式的结构图,原型模式的特点以及应用场景等方面一一对原型模式进行了相关的讲解,总得来说,原型模式主要解决的问题是,某些结构复杂的对象的创建工作,由于需求的变化,这些对象经常面临着剧烈的变化,但是她们却用用比较稳定的一致的接口。


图解Java设计模式(一)

02-27
1) 优秀的程序应该是这样的:阅读时,感觉很优雅;新增功能时,感觉很轻松;运行时,感觉很快速,这就需要设计模式支撑。 2) 设计模式包含了大量的编程思想,讲授和真正掌握并不容易,网上的设计模式课程不少,大多讲解的比较晦涩,没有真实的应用场景和框架源码支撑,学习后,只知其形,不知其神。就会造成这样结果: 知道各种设计模式,但是不知道怎么使用到真实项目。本课程针对上述问题,有针对性的进行了升级 (1) 授课方式采用 图解+框架源码分析的方式,让课程生动有趣好理解 (2) 系统全面的讲解了设计模式,包括 设计模式七大原则、UML类图-类的六大关系、23种设计模式及其分类,比如 单例模式的8种实现方式、工厂模式的3种实现方式、适配器模式的3种实现、代理模式的3种方式、深拷贝等 3) 如果你想写出规范、漂亮的程序,就花时间来学习下设计模式吧 课程内容和目标 本课程是使用Java来讲解设计模式,考虑到设计模式比较抽象,授课采用 图解+框架源码分析的方式 1) 内容包括: 设计模式七大原则(单一职责、接口隔离、依赖倒转、里氏替换、开闭原则、迪米特法则、合成复用)、UML类图(类的依赖、泛化和实现、类的关联、聚合和组合) 23种设计模式包括:创建型模式:单例模式(8种实现)、抽象工厂模式原型模式、建造者模式、工厂模式。结构型模式:适配器模式(3种实现)、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式(3种实现)。行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员能掌握主流设计模式,规范编程风格,提高优化程序结构和效率的能力。
©️2020 CSDN 皮肤主题: 代码科技 设计师: Amelia_0503 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值