优点
1.抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂
就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,
就可以在某种程度上改变整个软件系统的行为。另外,应用抽象工厂模式可以实现高内聚低耦合的设计目的,
因此抽象工厂模式得到了广泛的应用。
2.当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。这对
一些需要根据当前环境来决定其行为的软件系统来说,是一种非常实用的设计模式。
3.增加新的具体工厂和产品族很方便,无须修改已有系统,符合“开闭原则”。
缺点
1.在添加新的产品对象时,难以扩展抽象工厂来生产新种类的产品,这是因为在抽象工厂角色中规定了所有可能
被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,而这将涉及到对抽象工厂角色及其所
有子类的修改,显然会带来较大的不便。
2.开闭原则的倾斜性(增加新的工厂和产品族容易,增加新的产品等级结构麻烦)。
UML
抽象工厂模式包含如下角色:
AbstractFactory:抽象工厂
ConcreteFactory:具体工厂
AbstractProduct:抽象产品
Product:具体产品

image.png
产品图

image.png
具体实现
//--------------------抽象手机产品-----------------------
interface IPhoneProduct
{
//打电话
public function callUp();
//发短信
public function sendSMS();
}
//具体手机产品-小米
class XiaoMiPhone implements IPhoneProduct
{
public function callUp()
{
return '小米手机打电话';
}
public function sendSMS()
{
return '小米手机发短信';
}
}
//具体手机产品-华为
class HuaWeiPhone implements IPhoneProduct
{
public function callUp()
{
return '华为手机打电话';
}
public function sendSMS()
{
return '华为手机发短信';
}
}
//------------------抽象路由器产品-------------------------
interface IRouterProduct
{
//WI-FI
public function wifi();
//设置路由器
public function setting();
}
//具体路由器产品-小米
class XiaoMiRouter implements IRouterProduct
{
public function wifi()
{
return '小米路由器WIFI';
}
public function setting()
{
return '小米路由器配置';
}
}
//具体路由器产品-华为
class HuaWeiRouter implements IRouterProduct
{
public function wifi()
{
return '华为路由器WIFI';
}
public function setting()
{
return '华为路由器配置';
}
}
//-------------------抽象工厂------------------------
interface IProductFactory
{
//手机产品
public function iPhoneProduct();
//路由器产品
public function routerProduct();
}
//具体小米工厂
class XiaoMiFactory implements IProductFactory
{
public function iPhoneProduct()
{
//小米手机
return new XiaoMiPhone();
}
public function routerProduct()
{
//小米路由
return new XiaoMiRouter();
}
}
//具体华为工厂
class HuaWeiFactory implements IProductFactory
{
public function iPhoneProduct()
{
//华为手机
return new HuaWeiPhone();
}
public function routerProduct()
{
//华为路由
return new HuaWeiRouter();
}
}
//------------------客户端-------------------------
class Client
{
public static function main()
{
$xiaoMiFactory = new XiaoMiFactory();
print_r($xiaoMiFactory->iPhoneProduct()->callUp());
}
}
Client::main();
网友评论