工厂方法模式

工厂方法模式:定义了一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延期到其子类

在学习工厂方法模式之前,先回忆前面学的简单工厂模式;

简单工厂模式就是将对象的创建和逻辑的判断都交给了一个工厂类去做,这样做的优点是客户端不需要知道具体产品类的类名和具体产品的生产过程,达到分离的目的;
但是简单工厂模式的缺点也是不容忽略的,那就是工厂类的责任太过重大,而且如果产品类比较多的话,判断逻辑也会比较复杂,使系统的逻辑变得难理解;

工厂方法模式是属于GoF23种模式中的一种,它是基于简单工厂模式的设计模式,不过不同的是,工厂方法模式继承了简单工厂方法的优点,同时也没有简单工厂方法的缺点,即造成工厂类的复杂逻辑;而且如果要添加新的产品类的话,就不得不去修改工厂类的逻辑,违背了开闭原则,这是 我们不希望看到的;


那么,工厂方法模式到底是怎么做到这点的呢,下面我们先来看看工厂方法模式的定义;

工厂方法模式:工厂方法模式又称为工厂模式,它属于创建型模式;在工厂方法模式中,工厂父类负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象,这样做的目的是将产品类的实例化操作延迟到工厂子类中完成,即通过工厂子类来确定究竟该实例化哪一个具体产品类;


C++ 伪代码来简单实现

#include "stdafx.h"
#include<iostream>
using namespace std;
//TV是抽象产品类
class TV
{
public:
    //纯虚函数,抽象基类,公共方法;
    virtual void play() = 0;

    virtual ~TV()    //注意将基类的析构函数设为虚函数
    {
        cout<<"~TV"<<endl;
    }
};
class Hair:public TV
{
public:
    void play()
    {
        cout<<"Hair tv working!"<<endl;
    }

    ~Hair()  
    {
        cout<<"~Hair"<<endl;
    }
};
class TCL:public TV
{
public:
    void play()
    {
        cout<<"TCL tv working!"<<endl;
    }
    ~TCL()  
    {
        cout<<"~TCL"<<endl;
    }
};
//抽象工厂是用来生成产品的抽象接口
class BaseFactory
{
public:
    //纯虚函数,抽象类;
    virtual TV* product() = 0;

    virtual ~BaseFactory()    //注意将基类的析构函数设为虚函数
    {
        cout<<"~BaseFactory"<<endl;
    }
};
class SonHairFactory:public BaseFactory
{
public:
    TV* product()
    {
        //Hair子工厂返回Hair产品对象;
        //这里其实最好使用智能指针来维护这个对象,因为C++没有Java的垃圾回收机制
        //容易造成内存泄漏;
        cout<<"Hair tv being producted!"<<endl;
        return new Hair();
    }
    ~SonHairFactory()  
    {
        cout<<"~SonHairFactory"<<endl;
    }
};
class SonTCLFactory:BaseFactory
{
public:
    TV* product()
    {
        cout<<"TCL tv being producted!"<<endl;
        return new TCL();
    }
    ~SonTCLFactory()  
    {
        cout<<"~SonTCLFactory"<<endl;
    }
};
//我们直接以main函数来模拟客户端;
int main()
{
    //注意,C++千万不要写成TV tv,会被笑的,抽象基类不可以不实例化;
    TV* tv;
    BaseFactory* factory;
    //C++的话现在只能将子工厂类名暴露出来了
    factory = new SonHairFactory();
    tv = factory->product();    //生产的对象传给tv指针,Java的话直接是对象;
    tv->play(); 
    //释放空间; Java不需要,有垃圾回收机制;
    delete(tv);
    delete(factory);
    system("pause");
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值