ビジネスゴーストがファクトリーメソッドと抽象ファクトリモードを教える

ここに画像の説明を挿入

ストーリーライン

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;
}

はい。

作成は簡単ではありませんが、簡単に収集するのは良い習慣です。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43762191/article/details/108595990