抽象工厂,工厂方法,简单工厂对比
创建型类模式将一个对象的部分创建工作延迟到子类,而创建型对象模式则将它延迟到另一个对象中。
创建型:使得动态创建对象更灵活
结构型:添加第三方类降低耦合
行为型:满足对象之间的动态行为特征
一、工厂方法-创建型类模式
http://blog.163.com/zhoumhan_0351/blog/static/3995422720104277410773
class Product{//定义产品的抽象类
public:
Product(){}
//...一些操作
}
class Product1:public Product{//具体产品
public:
Product1(){}
//...一些操作
}
class Product2:public Product{//具体产品
public:
Product1(){}
//...一些操作
}
class Creator{//抽象类
public:
Creator(){}//可以定义一些缺省操作
virtual Product* Create(ProductId);//工厂方法
//...
//一些操作,比如对返回的Product进行操作,或者对建立Product
//的一些辅助操作,都可以声明为virtual
}
class Creator1:public Creator{//具体应用1
public:
Creator1(){}//可以定义一些缺省操作
Product* Create(ProductId);//工厂方法
//...
//一些操作,比如对返回的Product进行操作,或者对建立Product
//的一些辅助操作,都可以声明为virtual
}
class Creator2:public Creator{//具体应用2
public:
Creator2(){}//可以定义一些缺省操作
Product* Create(ProductId);//工厂方法
//...
//一些操作,比如对返回的Product进行操作,或者对建立Product
//的一些辅助操作,都可以声明为virtual
}
通过工厂方法,将一个对象的部分创建工作延迟到子类,解耦产品的实现和使用。方便了产品改变。
二、简单工厂
给工厂方法参数化,则称为简单工厂。
Product* Creator::Create(ProductId ID){
if(MINE==id) return new MyProduct;
if(YOURS==id) return new YourProduct;
//...
return 0;
}
类创建型模式之工厂方法(Factory Method)
http://blog.163.com/zhoumhan_0351/blog/static/39954227201031393276
三、抽象工厂-对象创建型模式
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
创建型模式简介
http://blog.163.com/zhoumhan_0351/blog/static/3995422720104277410773/
常常用工厂方法实现抽象工厂中具体的工厂。
class AbstractProductA{
public:
AbstractProductA(){}
//...
}
class AbstractProductA1:public AbstractProductA{
public:
AbstractProductA1(){}
//...
}
class AbstractProductA2:public AbstractProductA{
public:
AbstractProductA2(){}
//...
}
class AbstractProductB{
public:
AbstractProductB(){}
//...
}
class AbstractProductB1:public AbstractProductB{
public:
AbstractProductB1(){}
//...
}
class AbstractProductB2:public AbstractProductB{
public:
AbstractProductB2(){}
//...
}
class AbstractFactory{
AbstractFactory(){}
//下面每一个接口通常都是通过工厂方法来实现
virtual AbstractProductA* CreateProcudtA(){}//=0
virtual AbstractProductB* CreateProcudtB(){}//=0
//...
}
class ConcreteFactory1{
ConcreteFactory1(){}
//下面每一个接口通常都是通过工厂方法来实现
virtual AbstractProductA* CreateProcudtA(){}
virtual AbstractProductB* CreateProcudtB(){}
//...
}
class ConcreteFactory2{
ConcreteFactory2(){}
//下面每一个接口通常都是通过工厂方法来实现
virtual AbstractProductA* CreateProcudtA(){}
virtual AbstractProductB* CreateProcudtB(){}
//...
}
由此,我们可以看到,抽象工厂作为对象型创建模式,主要提供创建所需对象的一系列接口(这些接口通常通过工厂方法实现),这些对象通过组合方式来组建对象。缺点是如果用户扩展接口,则抽象工厂需要改变。
而工厂方法作为类创建型模式,通过继承来创建对象,将一个类的实例化延迟到其子类。
两者都封装对象创建,来实现用户与所使用的具体产品(用户与产品)之间的解耦。
四、OO Principles
封装变化的量
组合优先于继承
面向接口编程,而非实现
寻求对象继承间的松耦合
Classes should be open for extension but closed for modification
几个与设计模式相关的基本概念和原则
http://blog.163.com/zhoumhan_0351/blog/static/399542272010230103414517
设计模式基本原则
http://blog.163.com/zhoumhan_0351/blog/static/3995422720105655438106