设计模式学习--抽象工厂模式

抽象工厂模式是对象创建形模式的一种。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,使客户端在不必指定产品的具体的情况下,创建多个产品族中的产品对象。总的来说就是当发现需要创建一系列的对象,而此时发现耦合又高,为了以后的可扩展性,可以使用该模式。该模式的UML图如下:
抽象工厂模式的UML图
意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体类
适用性:1 一个系统要独立于它的产品的创建,组合和表示时;
2 一个系统要由多个产品系列中的一个配置时;
3 当你提供一个产品类时,而只是想表示他们的接口而不是实现时;
协作 :通常在运行的时刻创建一个ConcreateFactory的实列,为创建不同的产品,客户应使用不同的具体工厂。AbstractoryFactory把创建产品对象的任务推迟到他的子类
优缺点 优点
1 分离了具体的类,客户与类的实现分离,产品的类名也不出现的客户的代码当中
2 易与交换产品系列
3 有利于产品的一致性
缺点
1 难于支持新的 产品 ,因为抽象工厂类的接口已经写好了,要实现另外的产品必须要修改抽象工厂的类的接
口和增加新的产品类
下面是以假设生产人种为例,三种肤色的人种,性别有男女 例子:
首先是UML图:
这里写图片描述
下面是实现,首先是人种的接口类Human

#pragma once
//人类接口
class Human
{
public:
    //相应的人种颜色
    virtual void getColor();
    //说话
    virtual void talk();
    //性别
    virtual void getSex();
private:
};
#include "Human.h"
void Human::getColor()
{

}

void Human::talk()
{

}

void Human::getSex()
{

}
//具体的黑色人种
//AbstractBlackHuman.h
#pragma once

#include "Human.h"
#include <iostream>

class AbstractBlackHuman : public Human
{
public:
    AbstractBlackHuman();
    ~AbstractBlackHuman();

    void getColor();
    void talk();
private:
};

#include "AbstractBlackHuman.h"

using namespace std;

AbstractBlackHuman::AbstractBlackHuman()
{
}

AbstractBlackHuman::~AbstractBlackHuman()
{
}

void AbstractBlackHuman::getColor()
{
    cout << "黑色人种的皮肤颜色是黑色的" <<endl;
}

void AbstractBlackHuman::talk()
{
    cout << "黑色人种一般说的是多字节" << endl;
}
//黑色女性
#pragma once
#include "AbstractBlackHuman.h"
#include <iostream>

class FemaleBlackHuman : public AbstractBlackHuman
{
public:
    FemaleBlackHuman();
    ~FemaleBlackHuman();
    void getSex();
private:

};
#include "FemaleBlackHuman.h"

using namespace std;

FemaleBlackHuman::FemaleBlackHuman()
{
}

FemaleBlackHuman::~FemaleBlackHuman()
{
}

void FemaleBlackHuman::getSex()
{
    cout << "黑色女性" << endl;
}
//黑色男性
#pragma once
#include "AbstractBlackHuman.h"
#include <iostream>

class MaleBlackHuman : public AbstractBlackHuman
{
public:
    MaleBlackHuman();
    ~MaleBlackHuman();
    void getSex();
private:

};
#include "MaleBlackHuman.h"
using namespace std;

MaleBlackHuman::MaleBlackHuman()
{
}

MaleBlackHuman::~MaleBlackHuman()
{
}

void MaleBlackHuman::getSex()
{
    cout << "黑色男性" << endl;
}


//白色人种
//AbstractWhiteHuman.h
#pragma once

#include "Human.h"
#include <iostream>

class AbstractWhiteHuman : public Human
{
public:
    AbstractWhiteHuman();
    ~AbstractWhiteHuman();
    void getColor();
    void talk();
private:
};

#include "AbstractWhiteHuman.h"

using namespace std;

AbstractWhiteHuman::AbstractWhiteHuman()
{
}

AbstractWhiteHuman::~AbstractWhiteHuman()
{
}

void AbstractWhiteHuman::getColor()
{
    cout << "白色人种的皮肤颜色是白色的" << endl;
}

void AbstractWhiteHuman::talk()
{
    cout << "白色人种一般说的是单字节" << endl;
}
//白色女性
#pragma once
#include "AbstractWhiteHuman.h"
#include <iostream>
class FemaleWhiteHuman : public AbstractWhiteHuman
{
public:
    FemaleWhiteHuman();
    ~FemaleWhiteHuman();
    void getSex();
private:
};

#include "FemaleWhiteHuman.h"

using namespace std;


FemaleWhiteHuman::FemaleWhiteHuman()
{
}

FemaleWhiteHuman::~FemaleWhiteHuman()
{
}

void FemaleWhiteHuman::getSex()
{
    cout << "白色女性" << endl;
}
//白色男性
#pragma once
#include "AbstractWhiteHuman.h"
#include <iostream>
class MaleWhiteHuman : public AbstractWhiteHuman
{
public:
    MaleWhiteHuman();
    ~MaleWhiteHuman();
    void getSex();
private:
};

#include "MaleWhiteHuman.h"

using namespace std;

MaleWhiteHuman::MaleWhiteHuman()
{
}

MaleWhiteHuman::~MaleWhiteHuman()
{
}

void MaleWhiteHuman::getSex()
{
    cout << "白色男性" << endl;
}

//黄色人种
//AbstractYellowHuman.h
#pragma once

#include "Human.h"
#include <iostream>

class AbstractYellowHuman : public Human
{
public:
    AbstractYellowHuman();
    ~AbstractYellowHuman();
    void getColor();
    void talk();
private:
};

#include "AbstractYellowHuman.h"

using namespace std;

AbstractYellowHuman::AbstractYellowHuman()
{
}

AbstractYellowHuman::~AbstractYellowHuman()
{
}

void AbstractYellowHuman::getColor()
{
    cout << "黄色人种的皮肤颜色是黄色的" << endl;
}

void AbstractYellowHuman::talk()
{
    cout << "黄色人种一般说的是双字节" << endl;
}
//黄色女性
#pragma once
#include "AbstractYellowHuman.h"
#include <iostream>
class FemaleYellowHuman : public AbstractYellowHuman
{
public:
    FemaleYellowHuman();
    ~FemaleYellowHuman();
    void getSex();
private:
};
#include "FemaleYellowHuman.h"

using namespace std;

FemaleYellowHuman::FemaleYellowHuman()
{
}

FemaleYellowHuman::~FemaleYellowHuman()
{
}

void FemaleYellowHuman::getSex()
{
    cout << "黄色女性" << endl;
}
//黄色男性
#pragma once
#include "AbstractYellowHuman.h"
#include <iostream>
class MaleYellowHuman : public AbstractYellowHuman
{
public:
    MaleYellowHuman();
    ~MaleYellowHuman();
    void getSex();
private:
};
#include "MaleYellowHuman.h"

using namespace std;

MaleYellowHuman::MaleYellowHuman()
{
}

MaleYellowHuman::~MaleYellowHuman()
{
}

void MaleYellowHuman::getSex()
{
    cout << "黄色男性" << endl;
}

以上是产品的信息类,都是继承与Human类,Human作为人类的抽象接口。接下来就是工厂类,工厂类也有一个抽象的接口HumanFactory,采用纯虚函数:

#pragma once

#include "Human.h"


class HumanFactory
{
public:
    HumanFactory();
    ~HumanFactory();
    virtual Human* createBlackHuman() = 0;
    virtual Human* createWhiteHuman() = 0;
    virtual Human* createYellowHuman() = 0;
private:
};
//男性工厂类,返回三种人种的男性
#pragma once
#include "HumanFactory.h"
#include "MaleBlackHuman.h"
#include "MaleWhiteHuman.h"
#include "MaleYellowHuman.h"

class MaleFactory : public HumanFactory
{
public:
    MaleFactory();
    ~MaleFactory();
    Human* createBlackHuman();
    Human* createWhiteHuman();
    Human* createYellowHuman();
private:
};

#include "MaleFactory.h"
MaleFactory::MaleFactory()
{
}

MaleFactory::~MaleFactory()
{
}

Human* MaleFactory::createBlackHuman()
{
    return new MaleBlackHuman();
}

Human* MaleFactory::createWhiteHuman()
{
    return new MaleWhiteHuman();
}

Human* MaleFactory::createYellowHuman()
{
    return new MaleYellowHuman();
}
//女性产品的工厂类,返回三种人种的女性类
#pragma once
#include "HumanFactory.h"
#include "FemaleBlackHuman.h"
#include "FemaleWhiteHuman.h"
#include "FemaleYellowHuman.h"

class FemaleFactory : public HumanFactory
{
public:
    FemaleFactory();
    ~FemaleFactory();
    Human* createBlackHuman();
    Human* createWhiteHuman();
    Human* createYellowHuman();
private:
};

#include "FemaleFactory.h"

FemaleFactory::FemaleFactory()
{
}

FemaleFactory::~FemaleFactory()
{
}

Human* FemaleFactory::createBlackHuman()
{
    return new FemaleBlackHuman();
}

Human* FemaleFactory::createWhiteHuman()
{
    return new FemaleWhiteHuman();
}

Human* FemaleFactory::createYellowHuman()
{
    return new FemaleYellowHuman();
}

产品类和工厂类的实现完成了,接下来就客户调用的方法了,


#include "stdafx.h"
#include "Human.h"
#include "HumanFactory.h"
#include "FemaleFactory.h"
#include "MaleFactory.h"
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
   //生产女性工厂
    HumanFactory* femaleFactory = new FemaleFactory();
    //女性工厂生产出的黑色皮肤的女性
    Human* femaleBlackHuam = femaleFactory->createBlackHuman();
    femaleBlackHuam->getColor();
    femaleBlackHuam->getSex();
    femaleBlackHuam->talk();
    //男性工厂
    HumanFactory* maleFactory = new MaleFactory();
    //男性工厂生产出的黑色皮肤的男性
    Human* maleBlackHuame = maleFactory->createBlackHuman();
    maleBlackHuame->getColor();
    maleBlackHuame->getSex();
    maleBlackHuame->talk();
    return 0;
}

抽象工厂的学习先告一段落,以后有更好的理解的时候,回来修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值