美文网首页
抽象工厂模式(abstract factory模式)

抽象工厂模式(abstract factory模式)

作者: 苏康申 | 来源:发表于2020-03-07 13:23 被阅读0次

优点

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();

相关文章

网友评论

      本文标题:抽象工厂模式(abstract factory模式)

      本文链接:https://www.haomeiwen.com/subject/pftcdhtx.html