设计模式(二)工厂方法模式(Factory Mothod Pattern)

Key:工厂模式是为了产生任意的对象类型和控制对象的生产过程。
如果只是简单的产生任意类型的对象(不同的对象对同一个接口产生多态性),那么只要用多态就可以了,但是如果还想自己定制这个类型对象的生产过程,那么就要用到这个工厂模式了。例如创建对象前进行权限的检查,或者对对象的个数进行限制,或者检查系统的性能根据情况看看是否可以产生对象。这个设计模式有一个抽象的工厂和一个抽象的产品,

例如为了产生控制交通工具的对象,并且控制每个对象的生产过程,有下面的设计,在工厂方法里面,一个具体的工厂对应一个具体的产品,在扩展的时候这两个类是成对的加入的。下面是我画的类图。

 

 

 

下面是用C++实现的代码:

#include <iostream>
using namespace std;

class Moveable
{
        public:
                virtual void run() = 0;
                //这里如果不实现这个虚函数的话,必须把这个虚函数变成纯虚函数,否则在new Car()
                //操作的时候会建立虚表,但是又找不到Moveable里面run的实现,就会报错
};

class VehicleFactory
{
        public:
                virtual Moveable *create() = 0;
};

class Car:public Moveable
{
        public:
                void run()
                {
                        cout<<"car run!"<<endl;
                };
};

class CarFactory:public VehicleFactory
{
        public:
                Moveable *create()
                {
                        return new Car();
                };
};

class Plane:public Moveable
{
        public:
                void run()
                {
                        cout<<"plane run"<<endl;
                };
};

class PlaneFactory:public VehicleFactory
{
        public:
                Moveable *create()
                {
                        return new Plane();
                };
};
int main()
{
        //VehicleFactory *v = new PlaneFactory();//可以通过替换工厂就可以控制产生的对象类型,和对象的生产过程
        VehicleFactory *v = new CarFactory();
        Moveable *m = v->create();
        m->run();
        return 0;
}


// add 2013-8-5
         工厂方法是在类中四处散落着同一个对象的new的时候可以使用,如果类中到处都是new同一个对象,那么其实是依赖于具体的对象的,不是依赖于抽象。如果使用工厂方法,那么当这个对象需要替换的时候,那么只要修改Factory里面所创建的对象,就可以修改所有的在类中散落的对象(当然也可以修改这个对象,也可能工厂方法有参数,根据参数而返回不同的对象)。使用这个模式,要这个new 同一个对象出现次数较多。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值