昨日が過ぎました。昨日美しいことが起こっても、二度と起こせません。明日はまだ来ていません。花のように未来を想像します。それは未来です。手が長くても、できます。捕まえないでください。捕まえて制御できるのは今日だけです。
デザインパターンの学習、近い将来23のデザインパターンについてブログを書きますので、お楽しみに〜
定義
同じ作成プロセスで異なるスタイルを表現できるように、複雑なオブジェクトをその詳細(実装コード)から分離します。
使用するシーン
同じタイプの異なるスタイルを設計し、提案された要件に従って特定の値を返します
たとえば、今すぐ車を購入したい場合は、ドアを赤にする必要があります。彼が車をくれたときは、ドアを赤にする必要があります。
分類
- さまざまなスタイルをカスタマイズすることはできませんが、外観の順序を設定できます。たとえば
、KFCを最初に食べる、ハンバーガーを食べてコーラを最初に飲む、またはコーラを最初に飲んでハンバーガーを食べることができますが、それはできません。コーラを飲んだ後、ハンバーガーは捨てられました。これは許可されていません。 - 外観の順番や様々なスタイルなどを設定できます(推奨)
方法1
さまざまなスタイルをカスタマイズすることはできませんが、表示の順序を設定することはできます
全体のアイデア:
今、家を建てたいとしましょう。家を建てる担当者に家を渡す必要があります。これを最高司令官と呼びます。最高司令官が建築計画を立てた後家を建てるために、彼はそれを労働者に割り当てます。手順は次のとおりです。
- 基礎を築く
- RC
- 床のタイル
- ペイント
これは家の4つのステップです
UMLクラス図の理解:
UML类图(1.1)
:
分析:
- ビルダーは家の具体的な作成の詳細です(抽象クラス)
- 家は最後の家(商品)
- 労働者は家を建てる責任がある労働者です
- TotalCommandは最高司令官です。私はあなたに家のステップ(ビルダー)を与え、あなたは私の家に戻ります(ここではワーカーはビルダーから継承します)
特定のコードの実装:
ビルダークラス:家を建てる手順:
public abstract class Builder {
abstract void createA();//地基
abstract void createB();//钢筋混凝土
abstract void createC();//铺地砖
abstract void createD();//粉刷
//产品
abstract House getHouse();
}
住宅カテゴリー、最終製品:
public class House {
public String A = "地基";
public String B = "混凝土";
public String C = "铺地砖";
public String D = "粉刷";
}
ワーカーワーカー実装クラス:
public class Worker extends Builder {
private final House house;
public Worker() {
house = new House();
}
@Override
void createA() {
house.A = "打陨石地基";
Log.i("指挥者模式:","打陨石地基");
}
@Override
void createB() {
house.B = "黄金混凝土";
Log.i("指挥者模式:","黄金混凝土");
}
@Override
void createC() {
house.C = "铺钻石地砖";
Log.i("指挥者模式:","铺钻石地砖");
}
@Override
void createD() {
house.D = "美金粉刷";
Log.i("指挥者模式:","美金粉刷");
}
@Override//返回具体产品
House getHouse() {
return house;
}
}
TotalCommandクラス:最高司令官:
public class TotalCommand {
//返回产品
public House build(Builder builder){
builder.createA();
builder.createB();
builder.createC();
builder.createD();
return builder.getHouse();
}
}
実装コード:
//总指挥
TotalCommand totalCommand = new TotalCommand();
//总指挥吧具体实现步骤的工人传进去,最终得到House房子(产品)类
House house = totalCommand.build(new Worker());
效果图(2.1)
:
ご覧のとおり、製品は次の手順に従って順番に実行されます。
床タイルをペイントしてから舗装したい場合はどうすればよいですか?
TotalCommandに通知して、建物の計画を変更します
public class TotalCommand {
//返回产品
public House build(Builder builder){
builder.createD();
builder.createC();
builder.createA();
builder.createB();
return builder.getHouse();
}
}
效果图(2.2)
:
この方法は、前述の家を建てるなどの比較的固定されたコードによく使用されます。最初に基礎を築いてから、後続の操作を実行する必要があります。
方法2
外観の順番や様々なスタイルなどを設定できます(推奨)
全体のアイデア:
- 最初の方法は、コードに「ダイレクタ(コードフロー)」を与えてそれを実現することです。そのため、全体のフローを自由に変更することはできません。
- 2つ目の方法は、監督を自分自身に任せることであり、登場順序を自由に変更できます。
今KFCを食べているとしましょう:
ハンバーガーを食べて、コーラを飲んで、フライドポテトを食べて、鶏の足を食べてもいいですか?
フライドポテトが先に来たら、最初に2口食べなければなりませんo(╥﹏╥)o〜
これは注文の問題です、そうではありません家を建てる最初に土台を築き、次に何をするかを決めなければなりません。とても柔軟性があります。
UML(类图1.2)
:
コード:
Builder2クラスが実装する必要のある食べ物:
public abstract class Builder2 {
public abstract Builder2 createA(String msg);//汉堡
public abstract Builder2 createB(String msg);//薯条
public abstract Builder2 createC(String msg);//可乐
public abstract Builder2 createD(String msg);//鸡翅
public abstract Product buildProduct();//具体食物细节
}
製品固有の食品コードの実装:
public class Product {
private String A;//汉堡
private String B;//薯条
private String C;//可乐
private String D;//鸡翅
public String getA() {
return A;
}
public void setA(String a) {
A = a;
}
public String getB() {
return B;
}
public void setB(String b) {
B = b;
}
public String getC() {
return C;
}
public void setC(String c) {
C = c;
}
public String getD() {
return D;
}
public void setD(String d) {
D = d;
}
@Override
public String toString() {
return "Waiter{" +
"A='" + A + '\'' +
", B='" + B + '\'' +
", C='" + C + '\'' +
", D='" + D + '\'' +
'}';
}
}
メーカーメーカー、食品を作る:
public class Maker extends Builder2 {
private final Product product;
public Maker() {
product = new Product();
}
@Override
public Builder2 createA(String msg) {
product.setA(msg);
return this;
}
@Override
public Builder2 createB(String msg) {
product.setB(msg);
return this;
}
@Override
public Builder2 createC(String msg) {
product.setC(msg);
return this;
}
@Override
public Builder2 createD(String msg) {
product.setD(msg);
return this;
}
@Override
public Product buildProduct() {
return product;
}
}
実装コード:
//制造者
Maker maker = new Maker();
//制造者创建产品
Product product =
maker.createA("黄金汉堡").
createB("牛杯薯条").
createC("长生不老可乐").
createD("凤凰鸡翅").
buildProduct();
Log.i("建造者模式:", "product :" + product.toString());
效果图(2.3)
:
ビルダーモードと抽象ファクトリモードの比較
- ビルダーが返すのは構築された完全な製品であり、抽象ファクトリが返すのは関連製品です。これらの製品は異なる製品シリーズに配置され、「製品ファミリー」を生成します。
- 抽象ファクトリでは、クライアントはファクトリクラスをインスタンス化し、ファクトリクラスを呼び出して、対応する製品メソッドを取得します。モデルビルダーモードでは、製品シリーズ全体で対応するオブジェクトを直接生成します。
簡単に言えば、抽象工場は生産工場であり、ビルダーは対応する製品を直接生産する工場の労働者です。私はアウディを購入し、メインの工場に行き、アウディシリーズを見つけてからアウディ車を生産します。これはは抽象的な工場、アウディです。ドア、タイヤ、エンジンなど、車を作成する方法は、ビルダーモードです。
ファクトリパターン学習:ファクトリメソッドと抽象ファクトリを含む:Javaデザインパターンのファクトリパターン(2)
概要:
ビルダーモードは大きく2つの方法に分けられます。
- 方法1:製造工程は固定されており、製造工程は製造工程に従って製造されます。工程を自由に変更することはできず、柔軟性も高くありません。これは、「建築基準法」のコードの実現によく使用されます。家'
- Fang Shier:製造工程は固定されておらず、製品の外観の順序は自由に制御できるため、柔軟性があります。
これで作成モデルは終了です。次に、構造モデルを学習します。
最近の記事:
オリジナルになるのは簡単ではありません、応援してください〜