一、
Simple Factory
为了把事情说清楚,为了对自己的学习负责,偶不得不加一个
disgusted
所谓的“前言”。
这里,就先了解一下
Factory Method
模式的老爸
: Simple Factory
。
Simple Factory
属于类的创建型模式,它根据外界给定信息,让
Factory
来制造所需的产品。工厂对象能够生产的具体产品类
(ConcreteProduct)
通常继承同一个父产品类
(Product)
,实现(覆盖)接口方法。
Simple Factory
的基本结构如图:
简单工厂的实质是有一个工厂类根据传入的参数,动态的生成所需的具体产品对象。上图中体现了这个模式的三个角色:
-
工厂
(Creator
,上图中的
ProductFactory)
:
Simple Facory
的核心,负责创建所需产品对象。
-
抽象产品
(Product)
:所有具体产品类的父类,它负责描述所有实例公共的接口。
-
具体产品
(Concrete Product)
:具体的产品类,工厂所创建的真正实例。
说了半天废话,还是举例实在一点。
A.
定义一个手机抽象类
(Product)
classMobile
{
public
:
virtual
void
call()
=
0
;
//
Make a call
virtual
void
shortMsg()
=
0
;
//
Send adn receive short message
};
B.
2
个具体的产品(
Concrete Product
)
--Nokia
和
Moto
的手机
class
NokiaPhone : publicMobile
{
virtual
void
call() { cout
<<
"
Nokia calling
"
<<
endl; }
virtual
void
shortMsg() { cout
<<
"
Nokia short message
"
<<
endl; }
};
class
MotoPhone : publicMobile
{
virtual
void
call() { cout
<<
"
Moto calling
"
<<
endl; }
virtual
void
shortMsg() { cout
<<
"
Moto short message
"
<<
endl; }
};
C.
接下来是买手机过程类,相当于一个
Factory;
class
MobileShop
{
public
:
Mobile
*
buyPhone(string brand);
void
returnPhone( Mobile
*
phone);
//
最好有一个销毁产品的方法。
};
Mobile
*
MobileShop:: buyPhone(string brand)
{
if
(brand
==
"
Moto
"
)
return
(
new
MotoPhone());
if
(brand
==
"
Nokia
"
)
return
(
new
NokiaPhone());
else
{
cout
<<
"
No such brand
"
<<
endl;
return
NULL;
}
}
void
MobileShop::returnPhone(Mobile
*
phone)
{
if
(phone
!=
NULL)
delete(phone);
return
;
}
D.
现在各种角色都齐了,如果一个客户想买一个手机,就可以这样:
int
main()
{
MobileShop shop;
Mobile
*
nokia
=
shop.buyPhone(
"
Nokia
"
);
Mobile
*
moto
=
shop.buyPhone(
"
Moto
"
);
//现在用手机打电话,发短信
nokia
->
call();
nokia
->
shortMsg();
moto
->
call();
moto
->
shortMsg();
shop.returnPhone(nokia);
shop.returnPhone(moto);
}
由上面的代码示例可以看出:
1.
客户想要购买一个手机(生产一个产品),就找手机商店(
MobileShop
),告诉商店要
Moto
的手机还是
Nokia
的。
2.
商店必须知道它有哪些牌子的商品,如何创建这些商品。如果商店希望提供新的牌子(例如
SonyEricsson
)的产品,必须修改商店,在
buyMobile
方法中新添
SonyEricsson
的生产过程。