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

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

在前面的博文中,小编介绍了设计模式的相关知识,今天这篇博文,咱们继续来学习设计模式的相关知识,今天小编向大家介绍的模式是原型模式,还请小伙伴多多指教,小编会从什么是原型设计模式、原型模式的结构图、原型模式的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、隐藏克隆操作的细节,很多时候,对对象本身的克隆需要涉及到类本身的数据细节。

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


目录
相关文章
|
6月前
|
设计模式 安全 Java
面向对象编程的精髓:Java设计模式 - 原型模式(Prototype)完全参考手册
【4月更文挑战第7天】原型模式是OOP中的创建型设计模式,用于通过复制现有实例创建新实例,尤其适用于创建成本高或依赖其他对象的情况。它包括Prototype接口、ConcretePrototype实现和Client客户端角色。优点是性能优化、避免子类化和动态增加产品族。实现包括定义原型接口、实现具体原型和客户端调用克隆方法。最佳实践涉及确保克隆正确性、选择深拷贝或浅拷贝及考虑线程安全。但需注意克隆方法管理、性能开销和循环引用等问题。在Java中,实现Cloneable接口和覆盖clone方法可实现原型模式。
77 4
|
6月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
|
6月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
2月前
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
|
4月前
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
51 6
|
5月前
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
5月前
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
|
5月前
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式