码迷,mamicode.com
首页 > 其他好文 > 详细

Factory Method(工厂方法)-对象创建型模式

时间:2016-05-06 00:08:44      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:

1.意图

    定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。

2.动机

    框架使用抽象类定义和维护对象之间的关系。这些对象的创建通常也由框架负责。

3.适用性

  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一局部化的时候。

4.结构

         技术分享

5.代码实例

    

技术分享
class Product
{
public:
    virtual ~Product() = 0;
};

class OneProduct : public Product
{
public:
    OneProduct();
};

class TwoProduct : public Product
{
public:
    TwoProduct();
};

class ThreeProduct : public Product
{
public:
    ThreeProduct();
};

class FourProduct : public Product
{
public:
    FourProduct();
};
Product.h
技术分享
#include <memory>

class Product;
class Creator
{
public:
    virtual std::shared_ptr<Product> FactoryMethod() = 0;
};

class OneCreator : public Creator
{
public:
    std::shared_ptr<Product> FactoryMethod();
};

class TwoCreator : public Creator
{
public:
    std::shared_ptr<Product> FactoryMethod();
};


class ThreeCreator : public Creator
{
public:
    std::shared_ptr<Product> FactoryMethod();
};


class FourCreator : public Creator
{
public:
    std::shared_ptr<Product> FactoryMethod();
};
Creator.h
技术分享
#include "Product.h"
#include <iostream>

Product::~Product()
{

}


OneProduct::OneProduct()
{
    std::cout << "OneProduct Created" << std::endl;
}

TwoProduct::TwoProduct()
{
    std::cout << "TwoProduct Created" << std::endl;
}

ThreeProduct::ThreeProduct()
{
    std::cout << "ThreeProduct Created" << std::endl;
}

FourProduct::FourProduct()
{
    std::cout << "FourProduct Created" << std::endl;
}
Product.cpp
技术分享
#include "Creator.h"
#include "Product.h"


std::shared_ptr<Product> OneCreator::FactoryMethod()
{
    auto pProduct = std::shared_ptr<Product>(new OneProduct());
    return pProduct;
}

std::shared_ptr<Product> TwoCreator::FactoryMethod()
{
    auto pProduct = std::shared_ptr<Product>(new TwoProduct());
    return pProduct;
}

std::shared_ptr<Product> ThreeCreator::FactoryMethod()
{
    auto pProduct = std::shared_ptr<Product>(new ThreeProduct());
    return pProduct;
}

std::shared_ptr<Product> FourCreator::FactoryMethod()
{
    auto pProduct = std::shared_ptr<Product>(new FourProduct());
    return pProduct;
}
Creator.cpp
技术分享
#include<memory>
#include"Creator.h"

int main()
{
    auto pOneCreator = std::shared_ptr<OneCreator>(new OneCreator());
    auto pOneProduct = pOneCreator->FactoryMethod();

    auto pTwoCreator = std::shared_ptr<TwoCreator>(new TwoCreator());
    auto pTwoProduct = pTwoCreator->FactoryMethod();

    auto pThreeCreator = std::shared_ptr<ThreeCreator>(new ThreeCreator());
    auto pThreeProduct = pThreeCreator->FactoryMethod();

    auto pFourCreator = std::shared_ptr<FourCreator>(new FourCreator());
    auto pFourProduct = pFourCreator->FactoryMethod();

    while(1);
}
Test.cpp

6.测试结果

技术分享

7.效果

  • 优点:代码仅处理Product接口,不再绑定特定的ConcreteProduct。
  • 缺点:一个工厂方法仅创建一种产品,创建特定的ConcreteProduct需要创建Creator的子类。

8.变形

    工厂方法的变形是:可以参数化工厂方法,以使工厂方法可以创建多种产品。

 

Factory Method(工厂方法)-对象创建型模式

标签:

原文地址:http://www.cnblogs.com/mgp200866130/p/5463698.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!