创建型模式之FactoryMethod
2015-02-11 21:03
127 查看
1、意图
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
2、适用性
(1)当一个类不知道它所必须创建的对象的类的时候
(2)当一个类希望由它的子类来指定它所创建的对象的时候。
(3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、结构
UML类图表示为
4、参与者
Product:定义工厂方法所创建的对象的接口
ConcreteProduct:实现 Product接口
Creator:声明工厂,该方法返回一个Product类型的对象;可以调用工厂方法创建一个Product对象
ConcreteCreator:重定义工厂方法返回一个Concrete实例对象。
5、协作
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
其序列图表示为
6、效果
工厂方法不再将与特定应用有关的类绑定到你的代码中,仅处理Product接口。
缺点是仅仅为了创建一个特定的ConcreteProduct对象,就要创建ConcreteCreator子类。
c++样例代码
#include <iostream>
#include <string>
#include <memory>
using namespace std;
enum class ProductType
{
PRODUCT1,
PRODUCT2
};
class Product
{
public:
virtual void method() = 0;
};
class Product1 : public Product
{
public:
void method() {cout << "Product1:method()" << endl;}
};
class Product2 : public Product
{
public:
void method() {cout << "Product2:method()" << endl;}
};
class Creator
{
protected:
virtual unique_ptr<Product> factoryMethod(ProductType type) = 0;
public:
void opration()
{
ProductType productType[] = {ProductType::PRODUCT1, ProductType::PRODUCT2};
for (auto x : productType) {
unique_ptr<Product> product = factoryMethod(x);
product->method();
}
}
};
class ConcreteCreator : public Creator
{
public:
unique_ptr<Product> factoryMethod(ProductType type)
{
unique_ptr<Product> ret(nullptr);
switch (type) {
case ProductType::PRODUCT1:
ret.reset(new Product1);
break;
case ProductType::PRODUCT2:
ret.reset(new Product2);
break;
default:
break;
}
return ret;
}
};
int main()
{
ConcreteCreator cr;
cr.opration();
return 0;
}
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到子类。
2、适用性
(1)当一个类不知道它所必须创建的对象的类的时候
(2)当一个类希望由它的子类来指定它所创建的对象的时候。
(3)当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3、结构
UML类图表示为
4、参与者
Product:定义工厂方法所创建的对象的接口
ConcreteProduct:实现 Product接口
Creator:声明工厂,该方法返回一个Product类型的对象;可以调用工厂方法创建一个Product对象
ConcreteCreator:重定义工厂方法返回一个Concrete实例对象。
5、协作
Creator依赖于它的子类来定义工厂方法,所以它返回一个适当的ConcreteProduct实例。
其序列图表示为
6、效果
工厂方法不再将与特定应用有关的类绑定到你的代码中,仅处理Product接口。
缺点是仅仅为了创建一个特定的ConcreteProduct对象,就要创建ConcreteCreator子类。
c++样例代码
#include <iostream>
#include <string>
#include <memory>
using namespace std;
enum class ProductType
{
PRODUCT1,
PRODUCT2
};
class Product
{
public:
virtual void method() = 0;
};
class Product1 : public Product
{
public:
void method() {cout << "Product1:method()" << endl;}
};
class Product2 : public Product
{
public:
void method() {cout << "Product2:method()" << endl;}
};
class Creator
{
protected:
virtual unique_ptr<Product> factoryMethod(ProductType type) = 0;
public:
void opration()
{
ProductType productType[] = {ProductType::PRODUCT1, ProductType::PRODUCT2};
for (auto x : productType) {
unique_ptr<Product> product = factoryMethod(x);
product->method();
}
}
};
class ConcreteCreator : public Creator
{
public:
unique_ptr<Product> factoryMethod(ProductType type)
{
unique_ptr<Product> ret(nullptr);
switch (type) {
case ProductType::PRODUCT1:
ret.reset(new Product1);
break;
case ProductType::PRODUCT2:
ret.reset(new Product2);
break;
default:
break;
}
return ret;
}
};
int main()
{
ConcreteCreator cr;
cr.opration();
return 0;
}
相关文章推荐
- 设计模式----Factory Method --创建型
- (第Ⅱ部分 创建型模式篇) 第4章 工厂方法(Factory Method)
- C#面向对象设计模式纵横谈(5):Factory Method 工厂方法模式(创建型模式)
- (第Ⅱ部分 创建型模式篇) 第4章 工厂方法(Factory Method)
- C#面向对象设计模式纵横谈 学习笔记5 Factory Method 工厂方法(创建型模式)
- 四.创建型设计模式——Factory Method Pattern(工厂方法模式)
- C#面向对象设计模式第五讲:Factory Method 工厂方法(创建型模式)
- (第Ⅱ部分 创建型模式篇) 第4章 工厂方法(Factory Method)
- 笔记5:Factory Method 工厂方法模式(创建型模式)
- C#设计模式_创建型_FactoryMethod模式(learn from Lijianzhong & others)
- 创建型模式之三---FactoryMethod
- 设计模式笔记-创建型模式之三--工厂方法:Factory Method
- 设计模式-创建型模式之 Factory Method(工厂方法)
- 5. Factory Method 工厂方法(创建型模式)
- 3. 工厂方法模式(Factory Method)---------- 创建型模式
- [创建型模式系列]simple factory & factory method 简单工厂类和工厂方法类的概念及区别
- 设计模式----Factory Method --创建型
- 设计模式四:Factory method工厂方法——对象创建型模式
- 设计模式-3.3 Factory Method(工厂方法) 对象创建型模式
- C#面向对象设计模式纵横谈 笔记5 Factory Method 工厂方法(创建型模式)