设计模式-工厂方法

一、概述

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

二、意图

定义一个用于对象的接口,让子类决定实例化哪一个类。工厂方法模式可以使类的的实例化延迟到子类。

三、角色 

Product:定义工厂方法所创建对象的接口。

ConcreteProduct:实现Product接口。

Creator:定义工厂方法,该方法返回一个Product类型对象。

ConcreteCreator:重新定义工厂方法,返回一个ConcreteProduct类型对象。

四、UML


五、示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
// 产品公共抽象类 
class  Product
{
public :
     virtual  void  operation() = 0;
}; 
 
// 产品A 
class  ConcreteProductA :  public  Product
{
public :
     virtual  void  operation()
     {
         std::cout <<  "this is concreteProductA operation()"  << std::endl; 
     }
};
 
// 产品B 
class  ConcreteProductB :  public  Product
{
public :
     virtual  void  operation()
     {
         std::cout <<  "this is concreteProductB operation()"  << std::endl; 
     }
};
 
// 工厂方法 
class  Creator
{
public :
     virtual  Product* factoryMethod()
     {
         return  new  ConcreteProductA;
     }
};
 
// 重新定义工厂方法,继承工厂方法Creator 
class  ConcreteCreator :  public  Creator
{
public :
     virtual  Product* factoryMethod()
     {
         return  new  ConcreteProductB;
     }   
};
 
int  main( int  argc,  char  *argv[])
{
     //创建一个工厂方法A
     Creator creatorA;
     //利用工厂方法,创建对应的产品A 
     Product* productA = creatorA.factoryMethod();
     //调用产品A的操作 
     productA->operation();
     
     //创建一个工厂方法B
     ConcreteCreator creatorB;
     //利用工厂方法,创建对用的产品B 
     Product* productB = creatorB.factoryMethod();
     //调用产品B的操作 
     productB->operation();
     
     return  0;
}

六、 优缺点

优点:

1、具有良好的扩展性,当添加新的产品时,只需要实现一个工厂方法类和产品类。

2、具有良好的封装性,客户不需要知道具体产品类是什么类,只需要知道对应的工厂方法类即可。

缺点:

虽然具有良好的扩展性,但是当产品种类多时,需要大量的类,维护不方便

七、适用的场景

工厂方法模式的本质是:将类的实例化交由子类来决定。

1、当一个类不知道它所必需创建的具体对象类时,使用工厂方法模式。

2、当一个类希望由它的子类决定创建的具体对象时,使用工厂方法模式。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值