设计模式之c++实现(二)

简单工厂模式

实验环境 Ubuntu14.04

简单工厂模式是由一个工厂对象(Factory)决定创建出哪一种产品(Product)的实例

#ifndef __SIMPLEfACTORY_H_
#define __SIMPLEfACTORY_H_

#include <stdio.h>
#include <string>
#include <assert.h>

class CarBase
{
public:
    virtual void printName(){ printf("%s\n",name.c_str()); }
    virtual ~CarBase() = default;
protected:
    CarBase() = default;
    CarBase(std::string name_):name(name_){}
private:     
    std::string name;
};
class GMCar : public CarBase
{
public:
    GMCar():CarBase("GNCar")
    {
    }
    void printName()
    {
        printf("GMCar Test.\n");
        CarBase::printName();
    }
    ~GMCar() = default;
};
class FordCar : public CarBase
{
public:
    FordCar():CarBase("FordCar")
    {
    }
    void printName()
    {
        printf("FordCar Test.\n");
        CarBase::printName();
    }
    ~FordCar() = default;
};
class ToyotaCar : public CarBase
{
public:
    ToyotaCar():CarBase("ToyotaCar")
    {
    }
    void printName()
    {
        printf("ToyotaCar Test.\n");
        CarBase::printName();
    }
    ~ToyotaCar() = default;
};
//由一个工厂对象(Factory)决定创建出哪一种产品(Product)的实例
class CarFactory
{
public:
    static CarBase* create(const std::string name)
    {
        CarBase* car = NULL;
        if("GM" == name)
            car = new GMCar();
        if("Toyota" == name)
            car = new ToyotaCar();
        if("Ford" == name)
            car = new FordCar();
        return car;
    }
};
#endif

简单工厂测试代码

#include "simplefactory.h"
int main()
{
    CarBase* car = CarFactory::create("GM");
    car->printName();
    delete car;
    car = CarFactory::create("Ford");
    car->printName();
    delete car;
    car = CarFactory::create("Toyota");
    car->printName();
    delete car;
return 0;
}

缺点

简单工厂由于工厂类集中了所有实例的创建逻辑,违反了高内聚的责任分配原则,将全部逻辑集中到了一个
工厂类中;它所能创建的类只能是事先考虑到的,如果需要添加新的类,则就需要改变工厂类了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值