【設計模式系列】--原型模式

在前面的博文中,小編介紹了設計模式的相關知識,今天這篇博文,咱們繼續來學習設計模式的相關知識,今天小編向大家介紹的模式是原型模式,還請小夥伴多多指教,小編會從什麼是原型設計模式、原型模式的結構圖、原型模式的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、隱藏克隆操作的細節,很多時候,對對象本身的克隆需要涉及到類本身的數據細節。

小編寄語:該博文,小編主要簡單的介紹了原型模式,從什麼是原型模式,原型模式的結構圖,原型模式的特點以及應用場景等方面一一對原型模式進行了相關的講解,總得來說,原型模式主要解決的問題是,某些結構複雜的對象的創建工作,由於需求的變化,這些對象經常面臨着劇烈的變化,但是她們卻用用比較穩定的一致的接口。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章