你的位置:首页 > ASP.net教程

[ASP.net教程]Factory Method(工厂方法)

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.变形

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

 


新疆旅游路线推荐新疆自驾游攻略新疆旅游线路大全什么时候去新疆旅游最好新疆跟团旅游报价多少穷游北京_北京旅游怎么省钱?北京旅游省钱攻略 汕头礐石风景名胜区怎么收费?礐石塔山优惠价? 徜徉上海九大冷门古镇:金泽、新场、练塘 香港迪士尼乐园在哪里、怎么去? 中国免税店有哪些 十一扫荡中国免税店 中国免税店在哪里(图) 塞内加尔成为我国第151个公民出境旅游目的地 “秋之声”草地音乐会活动详情 2015国庆节怎么放假?国庆节放几天假? 秦岭漂流时间?西安秦岭漂流几点开始? 河源野趣沟好玩吗?野趣沟特色是什么? 西安秦岭漂流团购优惠吗?秦岭漂流有年龄限制吗? 九龙漂流需要带什么?万载九龙原始森林漂流需要带雨衣吗? 海口假日海滩离市区远吗?去那的公交有什么? 三亚的槟榔谷门票是多少?好玩吗? 假日海滩烧烤需要带些什么的?那边会提供什么? 海南湿冷吗?现在会不会很冷呀? 553-0002-863F Datasheet 553-0002-863F Datasheet 553-0002-865 Datasheet 553-0002-865 Datasheet 553-0002-875 Datasheet 553-0002-875 Datasheet 贺州出发去公主邮轮旅游 贺州出发去公主邮轮旅游 贺州出发去公主邮轮旅游 贺州出发去古巴旅游 贺州出发去古巴旅游 贺州出发去古巴旅游 贺州出发去瓜德罗普旅游 贺州出发去瓜德罗普旅游 贺州出发去瓜德罗普旅游