PHP设计模式之工厂模式和原型模式

简介:

这两个模式都是针对对象创建和复用的,只是一种设计风格,在创建对象的,随时都可以改进现有的代码。毕竟老代码很多地方不容易更改了,所以这两个模式一般适合新加进去,比较容易创建对象或者使用新对象


再者就是。。。算了


我想说的就是JS,把原型做的炉火纯青,我一直很痴迷,很多原型都深深的嵌入到语言的内核。


推荐那本书<你不知道的JS>


上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
<?php
     interface  Prototype{
         public  function  shallowCopy();
         public  function  deepCopy();
     }
 
     class  ConcretePrototype  implements  Prototype{
         private  $_name ;
         public  function  __construct( $name ){
             $this ->_name =  $name ;
         }
 
         public  function  setName( $name ){
             $this ->_name =  $name ;
         }
 
         public  function  shallowCopy(){
             //在php语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。
             //如果定义了__clone()方法,则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值
             //你要先new对象才能clone,一个是实例化,一个是克隆
             //对象的复制是通过关键字 clone 来实现的。用 clone 克隆出来的对象与原对象没有任何关系,它是把原来的对象从当前的位置重新复制了一份,也就是相当于在内存中新开辟了一块空间
             return  clone  $this ;
         }
 
         public  function  deepCopy(){
             //序列化深拷贝:利用序列化来做深拷贝,把对象写到流里的过程是序列化的过程,这一过程称为“冷冻”或“腌咸菜”,反序列化对象的过程叫做“解冻”或“回鲜”。这种深复制比较简单
             //当数组值包含如双引号、单引号或冒号等字符时,它们被反序列化后,可能会出现问题。为了克服这个问题,一个巧妙的技巧是使用base64_encode和base64_decode。
             //但是base64编码将增加字符串的长度。为了克服这个问题,可以和gzcompress一起使用。 //base64_encode(gzcompress(serialize($obj)));序列化
             //unserialize(gzuncompress(base64_decode($txt)));反序列化
 
             $serialize_obj  = serialize( $this );
             $clone_obj  = unserialize( $serialize_obj );
             return  $clone_obj ;
         }
         public  function  getName(){
             return  $this ->_name;
         }
     }
 
 
//上面的原型基本上就写完了
 
     class  Demo{
         public  $string ;
     }
     class  UsePrototype{
         public  function  shallow(){
             $demo  new  Demo();
             $demo ->string =  "susan" ;
             //新建
             $object_shallow_first  new  ConcretePrototype( $demo );
             //浅复制
             $object_shallow_second  $object_shallow_first ->shallowCopy();
             //之下代码可以删除
             echo  '新对象:<br/>' ;
             var_dump( $object_shallow_first ->getName());
             echo  '浅复制的对象<br/>' ;
             var_dump( $object_shallow_second ->getName());
             echo  '<br/>' ;
 
             $demo ->string =  "jack" ;
         
             echo  '我改变新建的对象属性:<br/>' ;
             var_dump( $object_shallow_first ->getName());
             echo  '浅复制是同一块内存,受影响<br/>' ;
             var_dump( $object_shallow_second ->getName());
             echo  '<br/>' ;
         }
 
         public  function  deep(){
             //新建对象,构造函数没参数就不用带括号
             $demo  new  Demo;
             $demo ->string =  "Siri" ;
             //新建
             $object_shallow_first  new  ConcretePrototype( $demo );
             //浅复制
             $object_shallow_second  $object_shallow_first ->deepCopy();
             //之下代码可以删除
             echo  '新对象:<br/>' ;
             var_dump( $object_shallow_first ->getName());
             echo  '深复制的对象<br/>' ;
             var_dump( $object_shallow_second ->getName());
             echo  '<br/>' ;
 
             $demo ->string =  "jack" ;
         
             echo  '我改变新建的对象属性:<br/>' ;
             var_dump( $object_shallow_first ->getName());
             echo  '深复制是完全新的对象,不受影响<br/>' ;
             var_dump( $object_shallow_second ->getName());
             echo  '<br/>' ;
         }
     }
 
     //调用
 
     $up  new  UsePrototype;
     $up ->shallow();
     echo  '<hr>' ;
     $up ->deep();
     //原型模式的主要思想是基于现有的对象克隆一个新的对象出来,一般是用对象内部提供的克隆方法,通过该方法返回一个对象的副本,这种创建对象的方式,相比我们之前说的几类创建型模式还是有区别的,之前的讲述的工厂方法模式与抽象工厂都是通过工厂封装具体的 new 操作的过程,返回一个新的对象,有的时候我们通过这样的创建工厂创建对象不值得,特别是以下的几个场景,可能使用原型模式更简单、效率更高:
 
     //如果说我们的对象类型不是刚开始就能确定,而是在运行时确定的话,那么我们通过这个类型的对象克隆出一个新的类型更容易。
     //有的时候我们可能在实际的项目中需要一个对象在某个状态下的副本,这个前提很重要,这点怎么理解呢,例如有的时候我们需要对比一个对象经过处理后的状态和处理前的状态是否发生过改变,可能我们就需要在执行某段处理之前,克隆这个对象此时状态的副本,然后等执行后的状态进行相应的对比,这样的应用在项目中也是经常会出现的。
     //当我们处理的对象比较简单,并且对象之间的区别很小,可能只是很固定的几个属性不同的时候,使用原型模式更合适。
 
 
?>



愿法界众生,皆得安乐


本文转自 jackdongting 51CTO博客,原文链接:http://blog.51cto.com/10725691/1954805

相关文章
|
10天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
10天前
|
设计模式 PHP
php设计模式--装饰模式(七)装饰模式完成文章编辑
php设计模式--装饰模式(七)装饰模式完成文章编辑
10 0
|
1月前
|
设计模式 安全 Java
【设计模式】原型模式
【设计模式】原型模式
|
2月前
|
设计模式 Java 关系型数据库
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
23种设计模式 —— 原型模式【克隆羊、浅拷贝、深拷贝】
38 1
|
4月前
|
设计模式 Java
Java设计模式【五】:原型模式
Java设计模式【五】:原型模式
17 0
|
4月前
|
设计模式 存储
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
二十三种设计模式全面解析-原型模式进阶之原型管理器:集中管理对象原型的设计模式之道
|
7天前
|
设计模式 Java
小谈设计模式(10)—原型模式
小谈设计模式(10)—原型模式
|
10天前
|
设计模式 PHP
php设计模式--责任链模式(五)
php设计模式--责任链模式(五)
11 0
|
1月前
|
设计模式 Java
设计模式之原型模式
设计模式之原型模式
|
3月前
|
设计模式 存储 JSON
Java设计模式-原型模式
原型模式也是创建对象的一种方式,它一般用在这样的场景:系统中存在大量相同或相似对象的创建问题,如果用传统的构造函数来创建对象,会比较复杂而且耗费资源。这个时候使用原型模式的克隆方式,能够节省不少时间。比如Java 类中提供的`Object clone()`就是原型模式的应用。
30 1
Java设计模式-原型模式