中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

計(jì)算機(jī)網(wǎng)站建設(shè)北京網(wǎng)站快速排名優(yōu)化

計(jì)算機(jī)網(wǎng)站建設(shè),北京網(wǎng)站快速排名優(yōu)化,廣州做網(wǎng)站的,聊城制作手機(jī)網(wǎng)站公司說(shuō)明:本文介紹設(shè)計(jì)模式中,創(chuàng)建型中的原型模式; 飛機(jī)大戰(zhàn) 創(chuàng)建型設(shè)計(jì)模式關(guān)注于對(duì)象的創(chuàng)建,原型模式也不例外。如簡(jiǎn)單工廠和工廠模式中提到過(guò)的飛機(jī)大戰(zhàn)這個(gè)例子,游戲中飛機(jī)、坦克對(duì)象會(huì)創(chuàng)建許許多多的實(shí)例&#xff0…

說(shuō)明:本文介紹設(shè)計(jì)模式中,創(chuàng)建型中的原型模式;

飛機(jī)大戰(zhàn)

創(chuàng)建型設(shè)計(jì)模式關(guān)注于對(duì)象的創(chuàng)建,原型模式也不例外。如簡(jiǎn)單工廠和工廠模式中提到過(guò)的飛機(jī)大戰(zhàn)這個(gè)例子,游戲中飛機(jī)、坦克對(duì)象會(huì)創(chuàng)建許許多多的實(shí)例,每個(gè)實(shí)例除了坐標(biāo),是一模一樣的,如果每次都用關(guān)鍵字new去創(chuàng)建,是非常消耗時(shí)間的。

在這里插入圖片描述

(Enemy,敵人抽象類)

/*** 敵人抽象類*/
public abstract class Enemy {/*** 敵人的坐標(biāo)*/protected int x;/*** 敵人的坐標(biāo)*/protected int y;/*** 抽象方法*/public Enemy(int x, int y) {this.x = x;this.y = y;}/*** 繪制方法*/public abstract void show();
}

(AirPlane,飛機(jī)類)

/*** 飛機(jī)*/
public class AirPlane extends Enemy {public AirPlane(int x, int y) {super(x, y);}@Overridepublic void show() {System.out.println("飛機(jī)出現(xiàn)了,坐標(biāo)是:" + x + "," + y);}
}

(Client,客戶端類,循環(huán)創(chuàng)建對(duì)象,浪費(fèi)資源,影響效率

import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 客戶端*/
public class Client {public static void main(String[] args) {// 屏幕寬度int screenLength = 100;// 定義飛機(jī)集合List<AirPlane> airPlanes = new ArrayList<>();// 創(chuàng)建飛機(jī)for (int i = 0; i < 100000; i++) {airPlanes.add(new AirPlane(new Random().nextInt(screenLength), 0));}}
}

原型模式

原型模式,是使用了Object類里面的clone()方法,對(duì)原型對(duì)象,也就是創(chuàng)建的第一個(gè)對(duì)象進(jìn)行了克隆,避免重復(fù)創(chuàng)建對(duì)象。如下:

(AirPlane,飛機(jī)類,實(shí)現(xiàn)Cloneable接口)

/*** 飛機(jī)*/
public class AirPlane extends Enemy implements Cloneable {public AirPlane(int x, int y) {super(x, y);}@Overridepublic void show() {System.out.println("飛機(jī)出現(xiàn)了,坐標(biāo)是:" + x + "," + y);}/*** clone方法,調(diào)用父類的clone方法*/public AirPlane clone() {Object obj = null;try {obj = super.clone();return (AirPlane) obj;} catch (CloneNotSupportedException e) {System.out.println("克隆失敗");return null;}}
}

(AirPlaneFactory,飛機(jī)工廠類,調(diào)用飛機(jī)的克隆方法)

/*** 飛機(jī)工廠*/
public class AirPlaneFactory {/*** 加載一個(gè)原型對(duì)象*/private static AirPlane airPlane = new AirPlane(0, 0);/*** 獲取飛機(jī)* @param x* @return*/public static AirPlane getAirPlane(int x) {AirPlane clone = airPlane.clone();clone.setX(x);return clone;}
}

(客戶端類,創(chuàng)建飛機(jī)實(shí)例對(duì)象)

import java.util.ArrayList;
import java.util.List;
import java.util.Random;/*** 客戶端*/
public class Client {public static void main(String[] args) {// 屏幕寬度int screenLength = 100;// 定義飛機(jī)集合List<AirPlane> airPlanes = new ArrayList<>();// 創(chuàng)建飛機(jī)for (int i = 0; i < 100000; i++) {airPlanes.add(AirPlaneFactory.getAirPlane(new Random().nextInt(screenLength)));}// 比較兩個(gè)飛機(jī)是否相等System.out.println(airPlanes.get(0) == airPlanes.get(1));}
}

克隆的實(shí)例,是不相等的

在這里插入圖片描述

以上就是通過(guò)原型模式實(shí)例化對(duì)象的過(guò)程,可以節(jié)約內(nèi)存空間。

淺拷貝和深拷貝

在使用了clone()方法時(shí),我們需要知道淺拷貝和深拷貝的概念。在Java中有基本數(shù)據(jù)類型和引用數(shù)據(jù)類型,其中基本數(shù)據(jù)類型有8種,分別是byte、short、int、long、float、double、char、boolean,除此之外的都是引用數(shù)據(jù)類型。

對(duì)于基本數(shù)據(jù)類型,淺拷貝和深拷貝都是創(chuàng)建一個(gè)新對(duì)象,而對(duì)于引用數(shù)據(jù)類型,淺拷貝是拷貝一個(gè)對(duì)象的指針,深拷貝是拷貝一個(gè)一模一樣的對(duì)象。

例如,在上面的基礎(chǔ)上,我創(chuàng)建一個(gè)機(jī)長(zhǎng)類,在飛機(jī)類里面注入一個(gè)機(jī)長(zhǎng)類對(duì)象,克隆之后,對(duì)飛機(jī)里面的機(jī)長(zhǎng)對(duì)象進(jìn)行判斷,如下:

(機(jī)長(zhǎng)類)

/*** 機(jī)長(zhǎng)*/
public class Captain implements Cloneable{/*** 姓名*/private String name;/*** 年齡*/private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

(注入一個(gè)機(jī)長(zhǎng)類對(duì)象)

/*** 飛機(jī)*/
public class AirPlane extends Enemy implements Cloneable {/*** 機(jī)長(zhǎng)*/private Captain captain;public AirPlane(int x, int y, Captain captain) {super(x, y);this.captain = captain;}@Overridepublic void show() {System.out.println("飛機(jī)出現(xiàn)了,坐標(biāo)是:" + x + "," + y);}/*** clone方法,調(diào)用父類的clone方法*/public AirPlane clone() {Object obj = null;try {obj = super.clone();return (AirPlane) obj;} catch (CloneNotSupportedException e) {System.out.println("克隆失敗");return null;}}public Captain getCaptain() {return captain;}
}

(克隆對(duì)象后,對(duì)飛機(jī)對(duì)象和飛機(jī)對(duì)象里面的機(jī)長(zhǎng)對(duì)象進(jìn)行判斷)

	// 比較兩個(gè)飛機(jī)是否相等System.out.println(airPlanes.get(0) == airPlanes.get(1));// 比較兩個(gè)飛機(jī)的機(jī)長(zhǎng)是否相等System.out.println(airPlanes.get(0).getCaptain() == airPlanes.get(1).getCaptain());

結(jié)果是飛機(jī)對(duì)象是互不相同的,但是飛機(jī)對(duì)象中的引用數(shù)據(jù)類型,是相同的,是淺拷貝;

在這里插入圖片描述

這肯定是不行的,每個(gè)實(shí)例的數(shù)據(jù)應(yīng)該是封裝獨(dú)有的,不能“克隆了,但沒(méi)完全克隆”。我們可以采用字節(jié)流的方式實(shí)現(xiàn)“深拷貝”,如下:

(敵人抽象類)

/*** 敵人抽象類*/
public abstract class Enemy {/*** 敵人的坐標(biāo)*/protected int x;/*** 敵人的坐標(biāo)*/protected int y;public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}/*** 繪制方法*/public abstract void show();
}

(飛機(jī)類,使用IO流的方式來(lái)實(shí)現(xiàn)深拷貝)

import java.io.*;/*** 飛機(jī)*/
public class AirPlane extends Enemy implements Serializable {/*** 機(jī)長(zhǎng)*/private Captain captain;public Captain getCaptain() {return captain;}public void setCaptain(Captain captain) {this.captain = captain;}@Overridepublic void show() {System.out.println("飛機(jī)出現(xiàn)了,坐標(biāo)是:" + x + "," + y);}/*** 獲取飛機(jī)* @param x* @return*/public AirPlane getAirPlane(int x) throws IOException, ClassNotFoundException {this.setX(x);// 創(chuàng)建對(duì)象輸出流ByteArrayOutputStream bao = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bao);oos.writeObject(this);// 返回克隆對(duì)象ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (AirPlane) ois.readObject();}
}

(機(jī)長(zhǎng)類)

import java.io.Serializable;/*** 機(jī)長(zhǎng)*/
public class Captain implements Serializable {/*** 姓名*/private String name;/*** 年齡*/private Integer age;public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}
}

創(chuàng)建對(duì)象,調(diào)用“克隆”方法,比較兩個(gè)對(duì)象的地址和對(duì)象內(nèi)的引用類型數(shù)據(jù)的地址;

import java.io.IOException;
import java.util.Random;/*** 客戶端*/
public class Client {public static void main(String[] args) throws IOException, ClassNotFoundException {// 屏幕寬度int screenLength = 100;AirPlane airPlane = new AirPlane();airPlane.setCaptain(new Captain());AirPlane airPlaneNew = airPlane.getAirPlane(new Random().nextInt(screenLength));// 比較兩個(gè)飛機(jī)是否相等System.out.println(airPlane == airPlaneNew);// 比較兩個(gè)飛機(jī)的機(jī)長(zhǎng)是否相等System.out.println(airPlane.getCaptain() == airPlaneNew.getCaptain());}
}

都為false,說(shuō)明“深拷貝”已經(jīng)實(shí)現(xiàn)。

在這里插入圖片描述

深克隆的實(shí)現(xiàn)并未用到Object的clone方法,而是使用了IO流中的Object流的方式,對(duì)對(duì)象進(jìn)行序列化來(lái)實(shí)現(xiàn)的。

原型管理器

原型管理器的構(gòu)想是,創(chuàng)建一個(gè)管理器類,包含了所有需要克隆的對(duì)象,需要的時(shí)候可以直接調(diào)用管理器中的方法,取一個(gè)克隆的對(duì)象出來(lái)。代碼如下:

(定義一個(gè)敵人接口,一個(gè)克隆方法,一個(gè)展示方法)

/*** 敵人接口*/
public interface Enemy extends Cloneable{/*** 克隆方法* @return*/Enemy clone();/*** 顯示方法*/void show();
}

(分別定義敵人飛機(jī)、敵人坦克對(duì)象)

/*** 敵人飛機(jī)*/
public class AirPlane implements Enemy{@Overridepublic Enemy clone() {AirPlane airPlane = null;try {airPlane = (AirPlane) super.clone();} catch (CloneNotSupportedException e) {System.out.println("克隆失敗");}return airPlane;}@Overridepublic void show() {System.out.println("敵人飛機(jī)");}
}/*** 敵人坦克*/
public class Tank implements Enemy{@Overridepublic Enemy clone() {Tank tank = null;try {tank = (Tank) super.clone();} catch (CloneNotSupportedException e) {System.out.println("克隆失敗");}return tank;}@Overridepublic void show() {System.out.println("敵人坦克");}
}

(定義原型管理器,通過(guò)getKey()的方式獲取到對(duì)應(yīng)對(duì)象的克隆實(shí)例)

import java.util.Hashtable;/*** 原型管理類*/
public class PrototypeManagement {private Hashtable ht = new Hashtable();private static PrototypeManagement pm = new PrototypeManagement();/*** 添加敵人* @param key* @param enemy*/public void addEnemy(String key, Enemy enemy) {ht.put(key, enemy);}/*** 獲取敵人* @param key* @return*/public Enemy getEnemy(String key) {Enemy enemy = (Enemy) ht.get(key);return enemy.clone();}public static PrototypeManagement getPrototypeManagement() {return pm;}
}

(客戶端測(cè)試)

/*** 原型管理器客戶端*/
public class Client {public static void main(String[] args) {PrototypeManagement pm = PrototypeManagement.getPrototypeManagement();// 添加敵人pm.addEnemy("airplane", new AirPlane());pm.addEnemy("tank", new Tank());AirPlane airplane = (AirPlane) pm.getEnemy("airplane");airplane.show();AirPlane airplaneNew = (AirPlane) pm.getEnemy("airplane");airplaneNew.show();System.out.println(airplane == airplaneNew);System.out.println("====================================");Tank tank = (Tank) pm.getEnemy("tank");tank.show();Tank tankNew = (Tank) pm.getEnemy("tank");tankNew.show();System.out.println(tank == tankNew);}
}

通過(guò)克隆獲取實(shí)例,地址不相等;

在這里插入圖片描述

此時(shí),如果需要增加一個(gè)Boss,非常簡(jiǎn)單,只需要新增一個(gè)類實(shí)現(xiàn)Enemy接口即可;

總結(jié)

本文參考《設(shè)計(jì)模式的藝術(shù)》、《秒懂設(shè)計(jì)模式》兩書(shū)

http://www.risenshineclean.com/news/3094.html

相關(guān)文章:

  • 文書(shū)寫(xiě)作網(wǎng)站企業(yè)網(wǎng)上的推廣
  • 如何做不同域名跳轉(zhuǎn)同一個(gè)網(wǎng)站外貿(mào)網(wǎng)站建設(shè)
  • 畢業(yè)答辯問(wèn)題怎么做的這個(gè)網(wǎng)站百度推廣按效果付費(fèi)是多少錢(qián)
  • 黑科技引流工具西安百度推廣優(yōu)化托管
  • wordpress 4.6 中文版seo研究中心學(xué)員案例
  • 網(wǎng)絡(luò)營(yíng)銷外包案例抖音seo關(guān)鍵詞排名技術(shù)
  • wordpress視頻無(wú)畫(huà)面搜索引擎優(yōu)化的英文
  • 合肥工大建設(shè)監(jiān)理有限公司網(wǎng)站信息流推廣渠道有哪些
  • 如何制作公司網(wǎng)站免費(fèi)軟文文案案例
  • wordpress 登錄慢seo精華網(wǎng)站
  • 五金加工廠怎么做網(wǎng)站seo搜索引擎優(yōu)化薪資
  • wordpress日文模板seo網(wǎng)絡(luò)營(yíng)銷招聘
  • 網(wǎng)站開(kāi)發(fā)常見(jiàn)面試目前常用的搜索引擎有哪些
  • 武漢網(wǎng)站策劃公司痘痘怎么去除有效果
  • 怎樣進(jìn)入公眾號(hào)平臺(tái)青島百度seo代理
  • 如何檢測(cè)網(wǎng)站開(kāi)發(fā)商留有后門(mén)網(wǎng)站seo是什么
  • 可以在手機(jī)建網(wǎng)站的百度網(wǎng)盤(pán)網(wǎng)址
  • 青島專業(yè)做網(wǎng)站的目前最火的自媒體平臺(tái)
  • 互動(dòng)網(wǎng)站案例培訓(xùn)教育機(jī)構(gòu)
  • 熊貓辦公ppt模板下載seo外包公司報(bào)價(jià)
  • 個(gè)體工商戶怎么做網(wǎng)站搜索引擎優(yōu)化英文簡(jiǎn)稱
  • html網(wǎng)站開(kāi)發(fā)論文新人跑業(yè)務(wù)怎么找客戶
  • 網(wǎng)站功能結(jié)構(gòu)圖 怎么做鄭州網(wǎng)絡(luò)營(yíng)銷顧問(wèn)
  • 餐飲管理培訓(xùn)課程成都百度seo推廣
  • 企業(yè)門(mén)戶網(wǎng)站設(shè)計(jì)方案如何推廣自己產(chǎn)品
  • 如何使用模板網(wǎng)站建設(shè)網(wǎng)頁(yè)seo系統(tǒng)是什么
  • 網(wǎng)站做的好的公司名稱泉州百度關(guān)鍵詞優(yōu)化
  • 網(wǎng)站開(kāi)發(fā)公司經(jīng)營(yíng)范圍手機(jī)百度賬號(hào)申請(qǐng)注冊(cè)
  • 企業(yè)做網(wǎng)站平臺(tái)的好處鶴壁seo推廣
  • 許昌知名網(wǎng)站建設(shè)價(jià)格重慶發(fā)布的最新消息今天