http://blog.youkuaiyun.com/lovelion/article/details/17517213
我做的这部分笔记,鉴于自身水平有限,我只是对上面博客内做进一步提炼和记录,方便自己查阅。同时,更多的是对设计模式的框架进行学习,大部分细节都将略去,让自己侧重对每个设计模式框架的理解。
我应该理解和掌握的:
1)能够画出这个设计模式的架构框图;
2)能够根据架构框图写出对应的伪代码;
3)这个模式的应用场景,主要优缺点。
1.简单工厂
(1)定义
enum ProductId
{
PRODUCTA,
PRODUCTB,
MAX,
};
class product //抽象产品类
{
public:
virtual void display();
};
class ConcreteProductA:public product //具体产品类A
{
public:
void display();
};
void ConcreteProductA::display()
{
log("display ConcreteProductA");
}
class ConcreteProductB:public priduct //具体产品类B
{
public:
void display();
};
void ConcreteProductB::display()
{
log("display ConcreteProductB");
}
class Factory //抽象工厂类
{
public:
virtual product* Create(ProductId id);
};
class ConcreteFactory:public Factory //具体工厂类
{
public:
product* Create(ProductId id);
};
product* ConcreteFactory::Create(ProductId id)
{
if(id == PRODUCTA)
{
return new ConcreteProductA();
}
else if(id == PRODUCTB)
{
return new ConcreteProductB();
}
else
{
...
}
}
//客户端如下
int main()
{
Product pd = NULL;
pd = ConcreteFactory.Create(PRODUCTB);//创建ConcreteProductB
pd.display();
return 0;
}
(2)总结
(3)适用场景
2.工厂方法
(1)定义
工厂方法:定义一个用于创建产品的接口或基类,让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类。工厂方法又称工厂模式。
它的结构图如下:
1)Product:定义工厂方法所创建的对象的接口;
2)ConcreteProduct:实现Product接口;
3)Fractory:声明工厂方法,返回一个Product类型对象;
4)ConcreteFactory:重定义工厂方法以返回一个ConcreteProduct对象。
以上架构框结构图的伪代码如下,Product部分和简单工厂代码一样:
class Factory //抽象工厂类
{
public:
virtual product* Create();
};
class ConcreteFactoryA:public Factory //具体工厂类A
{
public:
product* Create();
};
product* ConcreteFactoryA::Create()
{
return new ConcreteProductA();
}
class ConcreteFactoryB:public Factory //具体工厂类B
{
public:
product* Create();
};
product* ConcreteFactoryB::Create()
{
return new ConcreteProductB();
}
//客户端如下
int main()
{
Product pdA = NULL;
pdA = ConcreteFactoryA.Create();//创建ConcreteProductA
pdA.display();
Product pdB = NULL;
pdB = ConcreteFactoryB.Create();//创建ConcreteProductB
pdB.display();
return 0;
}
下面再来看一个工厂方法的隐藏,客户端无需调用工厂方法创建产品,直接通过工厂既可以使用所创建的对象中的业务方法:
class Factory //抽象工厂类
{
public:
virtual product* Create();
void display(); //product 方法
};
void Factory::display() //product 方法
{
Product pd = this.Create(); //由子类创建
pd.display();
}
class ConcreteFactoryA:public Factory //具体工厂类A
{
public:
product* Create();
};
product* ConcreteFactoryA::Create()
{
return new ConcreteProductA();
}
class ConcreteFactoryB:public Factory //具体工厂类B
{
public:
product* Create();
};
product* ConcreteFactoryB::Create()
{
return new ConcreteProductB();
}