3.抽象工厂模式

1.说明
请参阅第一篇文章
2.抽象工厂模式说明
抽象工厂模式:提供了一个创建一系列相关或相互依赖的对象的接口,而无需指定他们具体的类。
通俗:为创建不同的产品,或相同产品的不同型号,使用了不同的具体工厂来生产。
例如:富士康代工的有苹果的MAC,有IPhone,而华为代工魅族,nexus等。每个工厂可以有不同的产品,而这些产品可以进行可以进行抽象,工厂也可以进行抽象,所以就叫抽象工厂模式吧
优点:创建的实例过程和客户端分离,客户端通过接口来操作实例。产品的具体类名也被具体工厂隐藏。方便替换
缺点:当新增加一个产品时,改动很大,产品实例,工厂接口,具体工厂等都需改动
ex:抽象工厂增加某一产品,那么所有的实例化工厂类都会有改动,产品类也会增加
3.与简单工厂和工厂方法比较
个人还是喜欢简单工厂,虽然耦合性是最高,但胜在简单,抽象工厂适用于较为复杂的场景吧
4.UML
这里写图片描述
5.代码

//抽象工厂类
#ifndef __FACTORY_H
#define __FACTORY_H

#include "Book.h"
#include "Pad.h"

class CFactory
{
public:  
    virtual CBook* create_book() = 0;
    virtual CPad* create_pad() = 0; 
};
#endif
//富士康代工厂类
#ifndef __FOXFACTORY_H
#define __FOXFACTORY_H

#include "Factory.h"
#include "NoteBook.h"
#include "ThinkPad.h"

class CFoxFactory:public CFactory
{
public:
    virtual CBook* create_book()
    {
        return new CNoteBook();
    }
    virtual CPad* create_pad()
    {
        return new CThinkPad();
    }
};
#endif

//华为代工厂
#ifndef __HUAWEIFACTORY_H
#define __HUAWEIFACTORY_H

#include "Factory.h"
#include "MacBook.h"
#include "DellPad.h"

class CHuaweiFactory:public CFactory
{
public:
    CBook* create_book()  
    {
        return new CMacBook();
    }
    CPad* create_pad()  
    {
        return new CDellPad();
    }

};

#endif

//笔记本抽象类
#ifndef __BOOK_H
#define __BOOK_H

#include <iostream>

class CBook
{
public:
    virtual void playgame()=0;
    virtual void shutdown() = 0;
};

#endif

//具体笔记本1
#ifndef __NOTEBOOK_H
#define __NOTEBOOK_H

#include "Book.h"

class CNoteBook:public CBook
{
public:
    virtual void playgame()
    {
        std::cout<<"this is NoteBook playgame"<<std::endl;      
    }
    virtual void shutdown()
    {
        std::cout<<"this is NoteBook shutdown"<<std::endl;
    }
};

#endif

//具体笔记本2
#ifndef __MACBOOK_H
#define __MACBOOK_H

#include "Book.h"

class CMacBook:public CBook
{
public:
    virtual void playgame()
    {
        std::cout<<"this is mac playgame"<<std::endl;   
    }
    virtual void shutdown()
    {
        std::cout<<"this is mac shutdown"<<std::endl;
    }       
};

#endif

//pad抽象类
#ifndef __PAD_H
#define __PAD_H

#include <iostream>

class CPad
{
public:
    virtual void watch_moive() = 0;
    virtual void read_book() = 0;
};

#endif

//具体pad1

#ifndef __THINKPAD_H
#define __THINKPAD_H

#include "Pad.h"

class CThinkPad:public CPad
{
public:
    virtual void watch_moive()
    {
        std::cout<<"this is think-pad watch moive"<<std::endl;
    }   
    virtual void read_book()
    {
        std::cout<<"this is think-pad read book"<<std::endl;
    }
};
#endif

//具体pad2
#ifndef __DELLPAD_H
#define __DELLPAD_H

#include "Pad.h"

class CDellPad:public CPad
{
public:
    virtual void watch_moive()  
    {
        std::cout<<"this is dell watch-moive"<<std::endl;
    }
    virtual void read_book()  
    {
        std::cout<<"this is dell read-book"<<std::endl;
    }
};

#endif

//客户端

#include <iostream>
#include "HuaweiFactory.h"
#include "FoxFactory.h"
#include "Book.h"
#include "Pad.h" 

int main(void)
{
    CFactory* fact_one = new CHuaweiFactory();
    std::cout<<"this is my book-pad:"<<std::endl;
    CBook* mybook = fact_one->create_book();
    CPad* mypad = fact_one->create_pad();
    mybook->playgame();
    mybook->shutdown();
    mypad->watch_moive();
    mypad->read_book(); 

    std::cout<<"this is your book-pad"<<std::endl;
    CFactory* fact_two = new CFoxFactory();
    CBook* yourbook = fact_two->create_book();
    CPad* yourpad = fact_two->create_pad();
    yourbook->playgame();
    yourbook->shutdown();
    yourpad->watch_moive();
    yourpad->read_book();

    //说明:在析构函数中基类需要为虚析构函数中,此处并未实现
    delete fact_one;
    delete fact_two;
    delete yourbook;
    delete yourpad;
    delete mypad;
    delete mybook; 

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值