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

相关文章
|
3月前
|
设计模式 PHP
PHP中的设计模式:单一职责原则在软件开发中的应用
【10月更文挑战第8天】 在软件开发中,设计模式是解决常见问题的经验总结,而单一职责原则作为面向对象设计的基本原则之一,强调一个类应该只有一个引起变化的原因。本文将探讨单一职责原则在PHP中的应用,通过实际代码示例展示如何运用该原则来提高代码的可维护性和可扩展性。
40 1
|
2月前
|
设计模式 缓存 数据库连接
深入理解PHP的面向对象编程与设计模式####
本文旨在通过实例解析PHP中面向对象编程的核心概念及其在实际开发中的应用,特别是单例模式、工厂模式和观察者模式等常见设计模式。文章将展示这些模式如何帮助开发者构建更加灵活、可维护的代码结构,以及它们在解决具体问题时的优势。 ####
|
2月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入理解与应用
【10月更文挑战第22天】 在软件开发中,设计模式是解决特定问题的通用解决方案。本文将通过通俗易懂的语言和实例,深入探讨PHP中单例模式的概念、实现方法及其在实际开发中的应用,帮助读者更好地理解和运用这一重要的设计模式。
30 1
|
3月前
|
设计模式 监控 中间件
深入理解PHP中的中间件模式
【10月更文挑战第20天】探索PHP编程世界中的“交通枢纽”——中间件模式。从代码层面剖析如何实现请求和响应的高效管理,以及如何在开发中应用这一模式来增强项目的扩展性和维护性。
|
3月前
|
设计模式 PHP 开发者
PHP中的设计模式:桥接模式的解析与应用
在软件开发的浩瀚海洋中,设计模式如同灯塔一般,为开发者们指引方向。本文将深入探讨PHP中的一种重要设计模式——桥接模式。桥接模式巧妙地将抽象与实现分离,通过封装一个抽象的接口,使得实现和抽象可以独立变化。本文将阐述桥接模式的定义、结构、优缺点及其应用场景,并通过具体的PHP示例代码展示如何在实际项目中灵活运用这一设计模式。让我们一起走进桥接模式的世界,感受它的魅力所在。
|
3月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
3月前
|
设计模式 存储 数据库连接
PHP中的设计模式:单例模式的深入解析与实践
在PHP开发中,设计模式是提高代码可维护性、扩展性和复用性的关键技术之一。本文将通过探讨单例模式,一种最常用的设计模式,来揭示其在PHP中的应用及优势。单例模式确保一个类仅有一个实例,并提供一个全局访问点。通过实际案例,我们将展示如何在PHP项目中有效实现单例模式,以及如何利用这一模式优化资源配置和管理。无论是PHP初学者还是经验丰富的开发者,都能从本文中获得有价值的见解和技巧,进而提升自己的编程实践。
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与实践
【10月更文挑战第9天】 策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在PHP开发中,通过使用策略模式,我们可以轻松切换算法或逻辑处理方式而无需修改现有代码结构。本文将深入探讨策略模式的定义、结构以及如何在PHP中实现该模式,并通过实际案例展示其应用价值和优势。
47 1
|
3月前
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入解析与应用
【10月更文挑战第8天】 在软件开发的浩瀚宇宙中,设计模式如同星辰指引,照亮了代码设计与架构的航道。本文旨在深入探索PHP语境下策略模式(Strategy Pattern)的精髓,不仅剖析其内核原理,还将其融入实战演练,让理论在实践中生根发芽。策略模式,作为解决“如何优雅地封装算法族”的答案,以其独特的灵活性与扩展性,赋予PHP应用以动态变换行为的能力,而无需牵动既有的类结构。
48 2
|
3月前
|
中间件 PHP 开发者
深入理解PHP中的中间件模式
【10月更文挑战第6天】在PHP开发中,中间件模式是一种优雅的处理请求和响应的方式。本文将带你探索中间件模式的概念、实现及其在PHP框架中的应用,同时提供实用的代码示例来加深理解。