ストーリーライン
Guangjunがミルクティーショップを開いた後、次のステップは機械と材料を購入することでした。
飲料機械には、目の前に二つの選択肢があり、一つは「蛇口式飲料機械」で、こんな感じです。
もう1つは「醸造タイプ」のミルクティーマシンで、これは次のとおりです。
彼はそれを考え、2番目のものを選びました。
彼は言った:最初のタイプのマシンでは、新製品を追加したい場合、別のバケットを追加することしかできません。それは面倒です。このマシンが別のバケットを追加できるかどうかはわかりません。ミルクティーマシンの方が友好的です。材料を追加するだけです。混ぜ合わせ、かき混ぜ、加熱・冷蔵して販売すれば、思い通りの新製品が作れます。
ここですか?いいえ、いいえ、いいえ、私たちのGuangjunは馬鹿ではありません。ミルクティーを販売するだけでは満足できません。彼はハンバーガーマシン、ソーセージマシン、ミルクティー、ハンバーガー、ソーセージを購入することにしました。ハンバーガーは喉が渇いて喉が渇いています。ミルクティーを1杯注文してください。ミルクティーだけでは退屈です。ハンバーガーを注文してください。ハンバーガーがいっぱいではなく、ソーセージもいくつかあります。
このとき、これらの機械が点在していて、旅客の流れが大きいと、走り回って疲れ果ててしまうことがわかった。絶対に許されないので、彼は別のワークベンチを購入しました。
それはビジネスゴーストです!!
ファクトリーメソッドパターン
このストーリーの前半は、ファクトリーメソッドパターンの実装シナリオです。
ファクトリメソッドパターンとは何ですか?
オブジェクトを作成するためのインターフェースを定義し、インスタンス化するクラスをサブクラスに決定させます。ファクトリメソッドは、クラスのインスタンス化をそのサブクラスに遅らせます。
グアンジュンが彼の前でコーラマシンを購入した場合、ドリンクリストは制限され、柔軟性がなくなります。しかし、2台目のミルクティーマシンを購入したので、材料をマシンに注ぎ、残りはマシンに任せるだけです。新製品を作りたい場合は、原材料を変更してください。
ファクトリメソッドパターンのクラス図を見てみましょう。
コード
#include<iostream>
using namespace std;
//奶茶主类
class Milk {
public:
virtual void set_taste() = 0;//设置口味
virtual void add_burdening() = 0;//加料
};
//双皮奶
class custard :public Milk {
public:
void set_taste() {
cout << "草莓味双皮奶" << endl; }
void add_burdening() {
cout << "加珍珠" << endl; }
};
//珍珠奶茶
class pearl :public Milk {
public:
void set_taste() {
cout << "香草味珍珠奶茶" << endl; }
void add_burdening() {
cout << "加椰果" << endl; }
};
//拿铁
class coffee :public Milk {
public:
void set_taste() {
cout << "拿铁" << endl; }
void add_burdening() {
cout << "不加料" << endl; }
};
//巧克力瑞纳冰
class ruinaice :public Milk {
public:
void set_taste() {
cout << "巧克力瑞纳冰" << endl; }
void add_burdening() {
cout << "加奶油" << endl; }
};
//所有饮品定义完毕,接下来定义一台机器
//template<class T>
class abstractMachin {
public:
virtual void createMilk(Milk *c) = 0;
};
//机器具体实现
//template<class T>
class Machin :public abstractMachin {
public:
void createMilk(Milk *c) {
c->set_taste();
c->add_burdening();
}
};
//现在材料有了,机器也有了,是时候做奶茶了
class Boss {
//老板就是那个main()
};
int main() {
//初始化一个机器
abstractMachin* am = new Machin();
//先做瑞纳冰
Milk* ruina = new ruinaice();
am->createMilk(ruina);
return 0;
}
抽象的なファクトリパターン
抽象ファクトリパターンとは何か、その定義も非常に抽象的です。関連または相互依存するオブジェクトのグループを作成するためのインターフェイスを提供し、それらの特定のクラスを指定する必要はありません。
ここでは、一般的なクラス図:
言うまでもありませんが、それは抽象的すぎるので、ストーリーの図を見てみましょう(ワークベンチ==抽象マシン):
抽象クラスのテンプレートの使用を検討し、コードの実装を確認できます。
#include<iostream>
using namespace std;
//奶茶主类
class Milk {
public:
virtual void set_taste() = 0;//设置口味
virtual void add_burdening() = 0;//加料
};
//双皮奶
class custard :public Milk {
public:
void set_taste() {
cout << "草莓味双皮奶" << endl; }
void add_burdening() {
cout << "加珍珠" << endl; }
};
//珍珠奶茶
class pearl :public Milk {
public:
void set_taste() {
cout << "香草味珍珠奶茶" << endl; }
void add_burdening() {
cout << "加椰果" << endl; }
};
//拿铁
class coffee :public Milk {
public:
void set_taste() {
cout << "拿铁" << endl; }
void add_burdening() {
cout << "不加料" << endl; }
};
//巧克力瑞纳冰
class ruinaice :public Milk {
public:
void set_taste() {
cout << "巧克力瑞纳冰" << endl; }
void add_burdening() {
cout << "加奶油" << endl; }
};
//汉堡主类
class humberger {
public:
virtual void add_burdening() = 0;//加料
};
//牛肉堡
class beef :public humberger {
public:
void add_burdening() {
cout << "不加辣" << endl; }
};
//鸡腿堡
class chicken :public humberger {
public:
void add_burdening() {
cout << "微辣" << endl; }
};
//香辣堡
class piquancy :public humberger {
public:
void add_burdening() {
cout << "巨辣" << endl; }
};
//接下来定义一个工作台
template<class T1, class T2>
class abstractMachin {
public:
virtual void createMilk(T1* c) = 0;
virtual void createHumb(T2* c) = 0;
};
//工作台具体实现
template<class T1,class T2>
class Machin :public abstractMachin<T1,T2> {
public:
void createMilk(T1* c) {
c->set_taste();
c->add_burdening();
}
void createHumb(T2* c) {
c->add_burdening();
}
};
int main()
{
//初始化一个工作台
abstractMachin<Milk,humberger>* am = new Machin<Milk,humberger>();
//先做瑞纳冰
Milk* ruina = new ruinaice();
am->createMilk(ruina);
//再来个牛肉堡
abstractMachin<Milk,humberger>* bm = new Machin<Milk,humberger>();
beef* bf = new beef();
bm->createHumb(bf);
return 0;
}
はい。
作成は簡単ではありませんが、簡単に収集するのは良い習慣です。