核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
抽象工厂(Creator)角色
工厂方法模式的核心,任何工厂类都必须实现这个接口。
具体工厂( Concrete Creator)角色
具体工厂类是抽象工厂的一个实现,负责实例化产品对象。
抽象(Product)角色
工厂方法模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。
具体产品(Concrete Product)角色
工厂方法模式所创建的具体实例对象
工厂模式
#include <iostream>
#include <string>
using namespace std;
// 人物的抽象类
class Hero
{
public:
virtual void printName() = 0;
};
class A :public Hero
{
public:
virtual void printName()
{
cout << "我是A" << endl;
}
};
class B :public Hero
{
public:
virtual void printName()
{
cout << "我是B" << endl;
}
};
// 工厂的抽象类
class AbsFactory
{
public:
virtual Hero *createHero() = 0;
};
// 创建A的工厂
class A_Factory :public AbsFactory
{
public:
virtual Hero *createHero()
{
return new A;
}
};
// 创建B的工厂
class B_Factory :public AbsFactory
{
public:
virtual Hero *createHero()
{
return new B;
}
};
int main()
{
AbsFactory *pf1 = new A_Factory; // 生产A的工厂
Hero *p1 = pf1->createHero(); // 生产一个A
p1->printName();
AbsFactory *pf2 = new B_Factory; // 生产B的工厂
Hero *p2 = pf2->createHero(); // 生产一个B
p2->printName();
return 0;
}
简单工厂模式
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例
通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
#include <iostream>
#include <string>
using namespace std;
// 人物的抽象类
class Hero
{
public:
virtual void printName() = 0;
};
class A :public Hero
{
public:
virtual void printName()
{
cout << "我是A" << endl;
}
};
class B :public Hero
{
public:
virtual void printName()
{
cout << "我是B" << endl;
}
};
// 提供一个人物工厂,专门来创建人物
class Factory
{
public:
Hero *createHero(string name)
{
Hero *hero=NULL;
if (name == "A")
hero = new A;
else if (name == "B")
hero = new B;
return hero;
}
};
int main()
{
Factory *pf = new Factory; // 人物工厂,负责创建人物
Hero *p1 = pf->createHero("A");
p1->printName();
Hero *p2 = pf->createHero("B");
p2->printName();
return 0;
}
抽象工厂模式
#include <iostream>
using namespace std;
// 衣服的抽象类
class Clothes
{
public:
virtual void printName() = 0;
};
// 海澜之家
class HLZJ_TShirt:public Clothes
{
public:
virtual void printName()
{
cout << "海澜之家的T恤" << endl;
}
};
class HLZJ_Jeans:public Clothes
{
public:
virtual void printName()
{
cout << "海澜之家的 牛仔" << endl;
}
};
// JKQS
class JKQS_TShirt:public Clothes
{
public:
virtual void printName()
{
cout << "杰克琼斯的 T恤" << endl;
}
};
class JKQS_Jeans:public Clothes
{
public:
virtual void printName()
{
cout << "杰克琼斯的 牛仔" << endl;
}
};
// 工厂的抽象类:规定工厂要生产的所有产品种类, 种类不要增加,一开始就要确定
class AbsFactory
{
public:
virtual Clothes *createTShirt() = 0; // 必须生产 T恤
virtual Clothes *createJeans() = 0; // 必须生产 牛仔
};
// 造海澜之家的工厂
class HLZJ_Factory:public AbsFactory
{
public:
virtual Clothes *createTShirt()
{
return new HLZJ_TShirt;
}
virtual Clothes *createJeans()
{
return new HLZJ_Jeans;
}
};
// 造杰克琼斯的工厂
class JKQS_Factory:public AbsFactory
{
public:
virtual Clothes *createTShirt()
{
return new JKQS_TShirt;
}
virtual Clothes *createJeans()
{
return new JKQS_Jeans;
}
};
int main()
{
AbsFactory *pf1 = new HLZJ_Factory; // 生产衣服的工厂
Clothes *p1 = pf1->createTShirt();
p1->printName();
Clothes *p2 = pf1->createJeans();
p2->printName();
AbsFactory *pf2 = new JKQS_Factory; // 生产衣服的工厂
Clothes *p3 = pf2->createJeans();
p3->printName();
return 0;
}
简单工厂与抽象工厂的区别
简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。不修改代码的话,是无法扩展的。
抽象工厂是应对产品族概念的。比如说,每个汽车公司可能要同时生产轿车,货车,客车,那么每一个工厂都要有创建轿车,货车和客车的方法。
应对产品族概念而生,增加新的产品线很容易,但是无法增加新的产品。
区别
简单工厂 : 用来生产同一等级结构中的任意产品。(对于增加新的产品,无能为力)
工厂方法 :用来生产同一等级结构中的固定产品。(支持增加任意产品)
抽象工厂 :用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)
以上三种工厂 方法在等级结构和产品族这两个方向上的支持程度不同。所以要根据情况考虑应该使用哪种方法。
工厂方法模式和简单工厂模式比较
工厂方法模式与简单工厂模式在结构上的不同不是很明显。
工厂方法类的核心是一个抽象工厂类,而简单工厂模式把核心放在一个具体类上。
1.简单工厂和工厂方法的区别:简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。就像这个计算器,让客户端不用管该用哪个类的实例,只需要把“+”给工厂,工厂自动就给出了相应的实例,客户端只要去运算就可以了,不同的实例会实现不同的运算。
2.工厂模式方法(factory method),定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类。
3.工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在的,也就是说,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。你想要加功能,本来是要改工厂类的,而现在是修改客户端。
4.工厂方法克服了简单工厂违背开放-封闭原则的缺点,又保持了封装对象创建过程的优点。这两者都是集中封装了对象的创建,使得要更换对象时,不需要做大的改动就可实现,降低了客户程序与产品对象的耦合。工厂方法模式是简单工厂模式的进一步抽象和推广。由于使用了多态性,工厂方法模式保持了简单工厂模式的优点,而且克服了它的缺点。但缺点是由于每加一个产品,就需要加一个产品工厂的类,增加了额外的开发量。