迅速に車を作る-プロトタイプモード
記事ディレクトリ
あなたが車を作るのにうんざりしているならどうしますか?
前回はファクトリーモード(ファクトリー)を導入しました。つまり、ユーザーは特定のモデル情報を提供することで、ファクトリで生産および返品できます。
その後、顧客がどんどん少なくなり、工場が収支を合わせることができず、苦情も受けたことが発覚し、評判が非常に悪く、ドアを壊して閉店しようとしていたのですが、これはなぜですか?ああ、工場が遅すぎて車を生産できないことがわかりました。ビッグボスは突然100ロールスロイスを望んでいます。私たちの労働者はゼロから始め、部品を購入し、タイヤを組み立て、ボディを組み立て、エンジンを組み立てます...
支援するシニアエンジニア
組み立てが遅すぎたので、この時点で上級エンジニアは、この時点でロールスロイスがあれば、新しいロールスロイスを継続的にコピーできるのは素晴らしいことだと考えましたが、コピーは新しいものである必要があり、次に、属性、アセンブリの設計と追加を続けます。これは、上級エンジニアの魔法の武器であるクローン可能なインターフェイスです。このインターフェイスを実装するクラスである限り、同じ新しいロールスロイス車をコピーできます。!やがて、工場は再び立ち上がって、シニアエンジニアもシニアエンジニアに昇進しました~~~
ははは、これはデザインパターンのプロトタイプパターンの具体的な抽象化です!!!
ハイエンジニアの魔法の武器(プロトタイプモードの実装)
グラフィカルマジック(プロトタイプモード)
この時点で、問題が明らかになります。次のようにファクトリを保存する必要があります。
- モデルを設計しましょう。このモデルを設計するためのすべての本番プロセスに加えて、Cloneableインターフェイスを実装し、このモデルクラスのclone()メソッドをオーバーライドする必要があります。
- 新しい車を製造するときは、作成したモデルのclone()メソッドを呼び出すだけで、新しい車を作成できます。!!
ハイエンジニアの最初の具体的な実装(浅いコピー)
ロールスロイスモデル
package com.design_patterns.prototype.instance;
import com.design_patterns.factory.instance.Car;
public class RollsRoyce implements Car, Cloneable {
private String tirName = null; //轮胎型号
private String bodyName = null; //车身型号
private String engineName = null; //发动机型号
private Information information = null; //劳斯莱斯车的信息类对象
public String getTirName() {
return tirName;
}
public void setTirName(String tirName) {
this.tirName = tirName;
}
public String getBodyName() {
return bodyName;
}
public void setBodyName(String bodyName) {
this.bodyName = bodyName;
}
public String getEngineName() {
return engineName;
}
public void setEngineName(String engineName) {
this.engineName = engineName;
}
public Information getInformation() {
return information;
}
public void setInformation(Information information) {
this.information = information;
}
@Override
public void produce() {
System.out.println("劳斯莱斯车生产成功!");
}
/**
* 覆写劳斯莱斯车的拷贝方法,默认为父类的clone方法
* @return
* @throws CloneNotSupportedException
*/
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "RollsRoyce{" +
"tirName='" + tirName + '\'' +
", bodyName='" + bodyName + '\'' +
", engineName='" + engineName + '\'' +
", information=" + information +
'}';
}
}
ロールスロイス生産情報クラス情報(車の台数を示します)
package com.design_patterns.prototype.instance;
public class Information {
private static int amount = 0; //劳斯莱斯车的生产数量
public Information(){
amount++;
}
public static int getAmount() {
return amount;
}
public static void setAmount(int amount) {
Information.amount = amount;
}
@Override
public String toString() {
return "劳斯莱斯@num" + amount;
}
}
実動試験クラス
package com.design_patterns.prototype.instance;
public class Client {
public static void main(String[] args) throws Exception{
RollsRoyce rollsRoyce = new RollsRoyce();
rollsRoyce.setTirName("劳斯莱斯轮胎"); //制造轮胎
rollsRoyce.setBodyName("劳斯莱斯车身"); //制造车身
rollsRoyce.setEngineName("劳斯莱斯发动机"); //制造发动机
rollsRoyce.produce(); //制造汽车,此为汽车的制作全部过程
rollsRoyce.setInformation(new Information());
System.out.println("样本车产生---->" + rollsRoyce + "\n");
int num = 50;
RollsRoyce rollsRoyce1 = null;
while (num > 0){
//生产50辆劳斯莱斯车
rollsRoyce1 = (RollsRoyce) rollsRoyce.clone();
System.out.println(rollsRoyce1);
System.out.println("生产编号: " + rollsRoyce1.hashCode());
num--;
}
}
}
運転結果
劳斯莱斯车生产成功!
样本车产生---->RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1163157884
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1956725890
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 356573597
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 1735600054
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
生产编号: 21685669
......
由于生产50台,数据过多暂列举一部分,生产编号均不同
うわー、この時点で、まったく同じ50のロールスロイスがほぼ瞬時に生産され、セット、セット、セットの生産に苦労する必要がなく、生産効率が大幅に向上したことがわかりました。上司としてお客様がとても満足しているとき。
上級技術者は上司に、これらの50本のロールスロイスは販売できないと語った。将来の工場の前向きな発展のためには、それらを破壊しなければならない。なぜか。このとき、ロールスロイスのガラス窓に小さな文字が均一に印刷されていることに気づきました。情報:ロールスロイス@ num1、モデル番号がすべて1であるのはなぜですか。情報クラスがインスタンス化されると、カウントが累積されることが明確に決定されます。
現時点で、上級エンジニアは、実際には、情報のインスタンスは1つしかないと述べました。ロールスロイスカーをコピーするときにシャローコピーを使用します。Informationクラスは参照データタイプです。シャローコピーは、新しい参照データタイプの値を元の参照データのアドレスにポイントすることしかできず、複製することはできません。 (new)はデータ型を指します。(新しい)参照データ型Informationも生成する場合は、オーバーライドするclone()メソッドを改善する必要があります。上級エンジニアが解決策を提供しました...
新しいソリューション
シニアエンジニアはガイダンスプランを提供しました。これは(ロールスロイスクラス)次のようになります。
@Override protected Object clone() throws CloneNotSupportedException { return super.clone(); }
に改善
@Override protected Object clone() throws CloneNotSupportedException { RollsRoyce rollsRoyce = (RollsRoyce) super.clone(); rollsRoyce.information = new Information(); //实例化一个新的Information类对象 return rollsRoyce; //返回深拷贝后的劳斯莱斯车对象 }
これにより、クラスInformation Rolls-Royce情報が生成され、再び本番Rolls-Royce操作が実行されます。
運転結果
劳斯莱斯车生产成功!
样本车产生---->RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num1}
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num2}
生产编号: 1163157884
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num3}
生产编号: 1956725890
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num4}
生产编号: 356573597
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num5}
生产编号: 1735600054
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num6}
生产编号: 21685669
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num7}
生产编号: 2133927002
RollsRoyce{
tirName='劳斯莱斯轮胎', bodyName='劳斯莱斯车身', engineName='劳斯莱斯发动机', information=劳斯莱斯@num8}
生产编号: 1836019240
......
由于生产50台,数据过多暂列举一部分,生产编号均不同,information属性也不同
要約する
この例を使ってメモを書くのは初めてです。効果が良いかどうかはわかりません。実際、この章では、プロトタイプモードの基本的な使用法についても簡単に紹介します。浅いコピー、深いコピー、および深いコピーの提案として。オブジェクトのシリアル化を使用して実装されます(この記事には、深いコピーをシリアル化する方法があります)。
友達が文章が悪くないと感じたら、いいね、ちょっと、文章が良くないと感じたら、私にプライベートメッセージを送ってください、私はそれを訂正することができます、さあ!
シニアエンジニアがシニアエンジニアに昇進しましたが、彼はまだどれくらい行かなければなりませんか?