工厂模式

定义

工厂设计模式定义了一组创建对象的接口,同时使调用方避免确定将要实例化的类名称的步骤。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

工厂模式分为:简单工厂模式、工厂方法模式、抽象工厂模式。

简单工厂模式,通过静态方法创建对象。可以理解成,只负责生产同一等级结构中的任何一个产品,但是不能新增产品。

工厂方法模式,去掉了简单工厂模式中方法的静态属性,使其可以被子类集成,定义一个创建对象的接口,让子类去决定实例化哪个类。可以理解成,用来生产同一等级结构中的固定产品,但是支持增加产品。

抽象工厂模式,提供一个创建一系列相关或者相互依赖的对象的接口。可以理解成,用来生产不用类型的全部产品,但是不能增加新品,支持增加新的类型。

使用场景

工厂模式属于创建型设计模式,在创建若干个对象集合时,每个对象都实现相同的基对象(可以理解为接口),但每个对象的表现或特征。

解决问题

对调用者屏蔽具体实现,只需要关心接口即可。

可扩展,只需要添加实现对象类和修改工厂类即可。

减少主代码流中条件判断的复杂性。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值