定义
工厂设计模式定义了一组创建对象的接口,同时使调用方避免确定将要实例化的类名称的步骤。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式。
简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。
工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。
抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。
使用场景
工厂模式属于创建型设计模式,在创建若干个对象集合时,每个对象都实现相同的基对象(可以理解为接口),但每个对象的表现或特征。
解决问题
对调用者屏蔽具体实现,只需要关心接口即可。
可扩展,只需要添加实现对象类和修改工厂类即可。
减少主代码流中条件判断的复杂性。
UML类图
代码实现
简单工厂模式实现
class SerializeFactory{
public static function createSerialier(name){
if($name == "igb")
return new IgbSerialize();
else if($name == "json")
return new JsonSerialize();
else
throw new \Exception('invalid serialize name');
}
}
}
class IgbSerialize{
public function serialize(($source){
return igbinary_serialize($source);
}
public function deSerialize(($source){
return igbinary_unserialize($source);
}
}
class JsonSerialize{
public function serialize($source){
return json_encode($source);
}
public function deSerialize($source){
return json_decode($source, true);
}
}
$igbSerlizer = SerializeFactory::createSerialier("igb");
$igbSerlizer->serialize("abc");
$igbSerlizer->deSerialize("abc");
$jsonSerlizer = SerializeFactory::createSerialier("json");
$jsonSerlizer->serialize("abc");
$jsonSerlizer->deSerialize("abc");
工厂方法模式
工厂方法中,核心工厂类不再负责具体产品的创建,而是交给子类去创建,核心工厂类变成了抽象工厂,只是规定工厂子类必须实现的方法,不接触具体实例化的细节。
interface SerializerFactory{
interface createSerialier();
}
class IgbSerializerFactory implements SerializerFactory(){
public static createSerialier(){
return new IgbSerializer();
}
}
class JsonSerializerFactory implements SerializerFactory(){
public static createSerialier(){
return new JsonSerializer();
}
}
class IgbSerializer{
public function serialize(($source){
return igbinary_serialize($source);
}
public function deSerialize(($source){
return igbinary_unserialize($source);
}
}
class JsonSerializer{
public function serialize($source){
return json_encode($source);
}
public function deSerialize($source){
return json_decode($source, true);
}
}
$igbSerlizer = IgbSerializerFactory::createSerialier();
$igbSerlizer->serialize("abc");
$igbSerlizer->deSerialize("abc");
$jsonSerlizer = JsonSerializerFactory::createSerialier();
$jsonSerlizer->serialize("abc");
$jsonSerlizer->deSerialize("abc");
抽象工厂模式
//抽象工厂模式
interface SerializerFactory{ //将对象的创建抽象成一个接口
interface createJsonSerilaizer();
interface createIgbSerilalizer();
}
class JavaSerializerFactory implements SerializerFactory{
public function createJsonSerilaizer(){
return new JavaJsonSerilaizer();
}
public function createIgbSerilalizer(){
return new JavaIgbSerilalizer();
}
}
class PHPSerializerFactory implements SerializerFactory{
public function createJsonSerilaizer(){
return new PHPJsonSerilaizer();
}
public function createIgbSerilalizer(){
return new JavaIgbSerilalizer();
}
}
class PHPIgbSerializer{
public function serialize(($source){
return igbinary_serialize($source);
}
public function deSerialize(($source){
return igbinary_unserialize($source);
}
}
class PHPJsonSerializer{
public function serialize($source){
return json_encode($source);
}
public function deSerialize($source){
return json_decode($source, true);
}
}
class JavaIgbSerializer{
public function serialize(($source){
return xxxxx;
}
public function deSerialize(($source){
return xxxx;
}
}
class JavaJsonSerializer{
public function serialize($source){
return xxxxx;
}
public function deSerialize($source){
return JSONArray.fromObjec($source);
}
}
希望大家有所收获,并在讨论区留言。
—————————————————
参考网址:https://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html