程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 設計模式學習(1) --- 3類工廠模式

設計模式學習(1) --- 3類工廠模式

編輯:C++入門知識

設計模式學習(1) --- 3類工廠模式


講個故事吧。從前一個老板非常有錢,非常喜歡數碼產品手機,經常喜歡買智能手機,那麼怎麼買?當然,可以自己去各個手機店買,比如去蘋果店,三星店買。但是老板是非常忙的,怎麼辦?老板是程序員出生。面向對象嘛。加個層次,叫秘書去買,把要買的型號,寫張紙條給秘書即可。為什麼這樣做,對老板來說當然省事了,直接竊取秘書的勞動成果即可(因為付薪水了嘛)。秘書根據老板的指示去做,要買什麼牌子手機就去相應的專賣店買即可。OK,這樣應付了一段時間,因為這個時期智能手機剛剛興起,也就幾家可以做。

時光飛逝,歲月如梭。隨著科技的進步,智能手機市場太大,至於處於一個智能手機的元年,用某人的話說“風口上,豬都能飛起來”。所以,一大批智能手機廠商出現,一大批智能手機品牌出現,但是這個老板從喜歡買智能手機到喜歡收集研究智能手機了,因為土豪嘛,不差錢。所以知道哪裡又出款手機了,就叫秘書去買,天啊。這下可忙壞了秘書,要知道,世上的智能手機品牌這麼多,秘書的工作現在負擔變得更重了,不光要負責公司各種會議,還要天天出去買手機,心裡甚是不爽。當然,老板看在眼裡,就加了秘書的工資,並且給秘書配了幾個同事協助秘書買智能手機這件事。秘書加薪了又有同事一起來分擔,秘書這下爽了,這是要升職加薪充當CEO迎娶高富帥的節奏啊,頓時高興起來了。而且秘書又是總管。老板要買什麼新品牌手機,都是跟秘書先說,然後秘書在去分配其他同事分頭去買。當然為此老板需要多些人工費,土豪嘛,這能有幾個錢。ok這樣又過了一段時間。

時間飛逝,歲月如梭。隨著各大手機廠商的產品迭代,尼瑪iphone都出到了6了。老板收集起來更加瘋狂了,要把所有品牌的所有型號都買回來研究。這下又忙壞了秘書,因為秘書要搞清楚哪些個品牌都產到幾代了,這當然也不是什麼太大的難事,百度一下嘛,ok,在了解了各個品牌的系類產品後,再吩咐其他同事分別去買各個系列產品。當然如果產品品類太多,再增加個同事嘛。多付幾個人力費而已。

最後土豪老板就這樣將所有智能手機體驗了個遍,都覺得不行,沒有抓住消費者發燒心裡,於是打算自己干一款產品,於是安靜的創建了一家公司,勢必要打造一款全球級別的重量級智能手機...美好的事情即將發生....那麼問題來了,使用設計模式哪家強?

1.簡單工廠模式(simple factory)

OK,小學語文老師教會了我們在分析語文課文時,按照自然段來劃分中心思想。在第一段自然中程序員老板成分利用了自己所學的專長,將實際買手機問題,變成了面向對象問題(面向秘書哇!好幸福)。秘書具有按照老板要求買手機的功能。這個秘書就是工廠了(神馬秘書是工廠?)抽象為工廠啦!專門做一間買各種品牌手機的事。而對於手機而言,需不需要抽象?各大手機廠商,也不太可能造芯片,屏幕等配件,所以也是個具有技術含量的零配件組裝廠,所以可以具體抽象出行為(具有發短信,打電話,上網等功能的設備),各個實際手機廠商按照各自設計來設計。於是java代碼如下:

//抽象類實現
abstract class phone
{ //抽象類至少一個抽象方法 這樣才是抽象類
	abstract void phoneInf(); 
}
//具體產品
class iphone extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy iphone");
	}
}
class XiaoMi extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy XiaoMi");
	}
}
//工廠
class Secretary
{
	public static phone BuyPhone(String brand)
	{
		if(brand.equals("iphone") )
			return new iphone();
		else 
		{
			if( brand.equals("XiaoMi") )
				return new XiaoMi();
			else 
				return null;
		}
	}
}

class Main
{
	public static void main(String[] args)
	{ //老板只需要告訴秘書買什麼牌子的手機即可
		phone p1 = Secretary.BuyPhone("XiaoMi");
		p1.phoneInf();
		
		phone p2 = Secretary.BuyPhone("iphone");
		p2.phoneInf();
	}
}

/************************************************************************/
/* C++實現 簡單工廠模式 
 */
/************************************************************************/
#include 
#include 
using namespace std;

class Phone
{
public :
	virtual void phoneInf() =0; //純虛函數 
};

class iPhone : public Phone
{
public:
	void phoneInf()
	{
		cout<<"Buy iPhone"<phoneInf();

	Phone* p2 = Secretary::BuyPhone("XiaoMi");
	p2->phoneInf();
	return 0;
}

從上可見簡單工廠模式組成:

a.工廠類(這裡是秘書),核心部分。由一個具體的類實現。

b.抽象產品。 (這裡是phone),java中由一個接口或者抽象類實現。C++中可以由抽象類(含有純虛函數的類)實現。

C.具體產品。這裡指的是各個手機廠商產生的產品,比如iphone,xiaomi等。java中繼承或者實現 抽象類和接口,完成實際產品實例的創建。C++中子類實例化對象。

這樣做,老板(實際客戶)只提出請求,執行全部將由秘書(工廠類)來做。其中工廠類必須具有邏輯判斷等一些功能,比如秘書要能分辨各種手機品牌的功能。這樣子,數據量小時候,完全可以這麼做。一旦老板需要有些新手機,但是數據量較小時候,秘書就需要在買一些品牌了(對於工廠類而言,就是需要在修改類了)。

2.工廠方法模式(factory method)

第二自然段告訴我們,當秘書實在忙不過來了,頻繁的修改工廠類,相當於導致秘書工作量巨大,必須有人來幫忙才行。這下秘書只管負責安排任務,具體的手機叫手下買了,再給秘書即可。這時候,需要增加一個抽象工廠類,用於只分發任務功能,具體的工作由實際工廠來做。代碼如下:

//java 工廠方法模式 
//抽象產品
abstract class phone
{ 
	public abstract void phoneInf(); 
}
//具體產品
class iphone extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy iphone");
	}
}
class XiaoMi extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy XiaoMi");
	}
}
//抽象工廠類
abstract class Secretary
{
	public abstract phone BuyPhone();
}

//實際工廠類
class PersonA_iphone extends Secretary
{
	public phone BuyPhone()
	{
		return new iphone();
	}
}
class PersonB_XiaoMi extends Secretary
{
	public phone BuyPhone()
	{
		return new XiaoMi();
	}
}

class Main
{
	public static void main(String[] args)
	{ 
		//秘書分配person1去買iphone
		PersonA_iphone person1 = new PersonA_iphone() ;
		phone p1 = person1.BuyPhone();
		p1.phoneInf(); 
		//秘書分配person2去買XiaoMi
		PersonB_XiaoMi person2 = new PersonB_XiaoMi();
		phone p2 = person2.BuyPhone();
		p2.phoneInf();
	}
}
/************************************************************************
 C++實現 工廠方法模式 
************************************************************************/
#include 
#include 
using namespace std;

class Phone
{
public :
	virtual void phoneInf() =0; //純虛函數 
};

class iPhone : public Phone
{
public:
	void phoneInf()
	{
		cout<<"Buy iPhone"<phoneInf();
	
	//秘書叫person2 去買xiaomi
	PersonB_XiaoMi person2 ;
	Phone* phone2 = person2.BuyPhone();
	phone2->phoneInf();

	return 0;
}

從上可見工廠方法模式組成:

a. 抽象產品。 (這裡是phone),java中由一個接口或者抽象類實現。C++中可以由抽象類(含有純虛函數的類)實現。

b.具體產品。這裡指的是各個手機廠商產生的產品,比如iphone,xiaomi等。java中繼承或者實現 抽象類和接口,完成實際產品實例的創建。C++中子類實例化對象。

c. 抽象工廠類(這裡是秘書),相比於簡單工廠模式,增加的,將秘書從實際勞力中解放出來,只負責安排任務,由一個抽象類實現。

d.實際工廠。指的是 實際買手機的人。實際類實例化。

這樣將導致,秘書輕松了許多,具體買手機這件事,也比較好做,只要人手夠多,一旦要新買個手機,只需要秘書在派個人即可,這樣對於秘書而言,依然輕松,可擴展。但是唯一的壞處就是需要花錢雇傭人手,多應於實際代碼張就是要多很多實際的類。whatever,事情可以達到要求嘛。

3.抽象工廠模式

第三自然段告訴我們,手機廠商都出系列手機了,前兩模式都不適用了,總不可能秘書吩咐A去買iphone1,又叫B去買iphone2吧..當然也可以,但是沒必要啊。買iPhone1的肯定可以去買iphone2嘛。所以秘書需要從新規劃下任務清單,好重新安排任務了。

//java 抽象工廠模式
//抽象產品類
abstract class phone
{ 
	public abstract void phoneInf(); 
}
//具體產品
class iphone1 extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy iphone1");
	}
}
class iphone1s extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy iphone1s");
	}
}
class XiaoMi1 extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy XiaoMi1");
	}
}
class XiaoMi1s extends phone
{
	public void phoneInf()
	{
		System.out.println("Buy XiaoMi1s");
	}
}
//抽象工廠類
abstract class Secretary
{
	public abstract phone BuyPhone_1();//買一代手機
	public abstract phone BuyPhone_1s(); //買一代升級版
	//public abstract phone BuyPhone_2(); //買二代手機
	//繼續擴展...
}

//實際工廠類
class PersonA_iphone extends Secretary
{
	public phone BuyPhone_1()//買iphone一代手機
	{
		return new iphone1();
	}
	public phone BuyPhone_1s()//買iphone1s版
	{
		return new iphone1s();
	}
}
class PersonB_XiaoMi extends Secretary
{
	public phone BuyPhone_1()
	{
		return new XiaoMi1();
	}
	public phone BuyPhone_1s()
	{
		return new XiaoMi1s();
	}
}

class Main
{
	public static void main(String[] args)
	{ 
		//秘書分配person1去買iphone1,1s產品
		PersonA_iphone person1 = new PersonA_iphone() ;
		phone p1 = person1.BuyPhone_1();//personA 買的iphone1
		phone p2 = person1.BuyPhone_1s();//personA 買的iphone1s
		p1.phoneInf(); 
		p2.phoneInf();
		
		//秘書分配person2去買XiaoMi1,1s產品
		PersonB_XiaoMi person2 = new PersonB_XiaoMi();
		phone p3 = person2.BuyPhone_1();
		p3.phoneInf();
		phone p4 = person2.BuyPhone_1s();
		p4.phoneInf();
	}
}

/***********************************************************************
C++實現 抽象工廠模式
*********************************************************************/
#include 
#include 
using namespace std;
//抽象產品類
class Phone
{
public :
	virtual void phoneInf() =0; //純虛函數 
};
//實際產品
class iPhone1 : public Phone
{
public:
	void phoneInf()
	{
		cout<<"Buy iPhone1"<phoneInf();
	phone2->phoneInf();

	//秘書叫person2 去買xiaomi1,1s
	PersonB_XiaoMi person2 ;
	Phone* phone3 = person2.BuyPhone1();
	Phone* phone4 = person2.BuyPhone1s();
	phone3->phoneInf();
	phone4->phoneInf();

	return 0;
}
分析組成:和工廠方法模式一樣:

a. 抽象產品。 (這裡是phone),java中由一個接口或者抽象類實現。C++中可以由抽象類(含有純虛函數的類)實現。

b.具體產品。這裡指的是各個手機廠商產生的產品,比如iphone1,1s,xiaomi1等。java中繼承或者實現 抽象類和接口,完成實際產品實例的創建。C++中子類實例化對象。

c. 抽象工廠類(這裡是秘書),相比於簡單工廠模式,增加的,將秘書從實際勞力中解放出來,只負責安排任務,由一個抽象類實現。但是對於這樣的產品族而言,需要重新設計秘書類了。如本例中。

d.實際工廠。指的是 實際買手機的人。實際類實例化。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved