设计模式浅析——工厂模式

1. 工厂模式定义

定义一个用于创建对象的接口,让子类决定实例化哪个类。Factory Method使得一个类的实例化延迟(目的:解耦 手段:虚函数)到子类。

补充:编译时依赖和运行时依赖

编译依赖:

export LIBRARY_PATH=${HOME}/local/lib:$LIBRARY_PATH

export PKG_CONFIG_PATH=/usr/share/pkgconfig:${HOME}/local/lib/pkgconfig

运行库依赖:

export LD_LIBRARY_PATH=${HOME}/local/lib

2. 工厂模式结构图

3. 使用前提

我们在代码中经常使用到new来实例化一个对象,但是new一个具体的类在某些场景下违背了依赖倒转原则,抽象不依赖于细节,细节依赖于抽象,所以在代码设计的时候才考虑到用工厂模式来解耦。

4. 代码

//抽象基类(手机)
class Phone
{
public:
    virtual void Video() = 0;
    virtual ~Phone() {}
};

//工厂基类(创建手机)
class CreatePhone
{
public:
    virtual Phone* CreatePhoneFactory() = 0;   //析构函数实现运行时依赖
    virtual ~CreatePhone() {}    //虚析构函数
};

//具体类A
class PhoneA : public Phone
{
public:
    virtual void Video()
    {
        cout << "PhoneA" << endl;
    }
};

//具体类B
class PhoneB : public Phone
{
public:
    virtual void Video()
    {
        cout << "PhoneB" << endl;
    }
};

//工厂类A
class CreatePhoneFactoryA : public CreatePhone
{
public:
    virtual Phone* CreatePhoneFactory()
    {
        return new PhoneA();
    }
};

//工厂类B
class CreatePhoneFactoryB : public CreatePhone
{
public:
    virtual Phone* CreatePhoneFactory()
    {
        return new PhoneB();
    }
};

 

//具体调用实现类

class Impl
{
public:
    //外部传入具体类 本类中已不依赖于具体类
    Impl(CreatePhone* factory)
    {
        m_factory = factory;
    }

    void Method()
    {
        Phone* phone = m_factory->CreatePhoneFactory();  //多态new 将变化移出本类

        //手机打开视频
        phone->Video();
    }
private:
    CreatePhone* m_factory = nullptr;
};

5. 总结:

1. Factory Method模式用于隔离类对象的使用者和具体类型之间的耦合关系。面对一个经常变化的具体类型,紧耦合关系(new)会导致软件的脆弱。

2. Factory Method模式通过面向对象的手法,将所要创建的具体对象工作延迟到子类,从而实现一种扩展(非更改)的策略。

3. Factory Method模式解决“单个对象”的需求变化。缺点在于要求创建方法/参数相同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值