微信扫一扫打赏支持

php 设计模式之工厂模式

php 设计模式之工厂模式

简介:

在开发大型系统过程中,往往会出现这样一种情况:

我有一部分基础数据,是类classA是从数据库A读取出来的,其他很多的功能都是基于这个基础数据来操作的。现在呢,我想把数据从数据库A变成从另外的数据源去获取,这时候,要修改起来就比较麻烦,要修改其他很多类的代码。这种设计显然是不够灵活的,换句话说,就是紧耦合的,系统中某个部分的函数或类严重依赖于系统的其他部分中的函数或类的行为和结构。

工厂模式,就是解决这样的一些情况的设计方法。工厂模式是一种类,建立了一个工厂来根据所需来创建对象,这种方式在多态性编程中是很重要的,允许动态替换类修改配置等。

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

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

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

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

 

简单工厂方法:自己根据自己传过去的参数获得自己想要的东西。其实便于代码的复用。

 

代码:

  1 <?php
  2 /**
  3  * 基本工厂模式
  4  * */
  5 class User { 
  6     private $username; 
  7     public function __construct($username) { 
  8         $this->username = $username; 
  9     } 
 10     
 11     public function getUser() { 
 12         return $this->username; 
 13     } 
 14 }
 15 
 16 class userFactory { 
 17     static public function createUser() { 
 18         return new User('Jack'); 
 19     } 
 20 }
 21 
 22 $user = userFactory::createUser();echo $user->getUser();
 23 
 24 /**
 25  *简单工厂模式
 26  * */
 27 interface userProperties {
 28     function getUsername();
 29     function getGender();
 30     function getJob();
 31 }
 32 class User implements userProperties{
 33     private $username;
 34     private $gender;
 35     private $job;
 36     public function __construct($username, $gender, $job) {
 37         $this->username = $username;
 38         $this->gender = $gender;
 39         $this->job = $job;
 40     }
 41 
 42     public function getUsername() {
 43         return $this->username;
 44     }
 45 
 46     public function getGender() {
 47         return $this->gender;
 48     }
 49 
 50     public function getJob() {
 51         return $this->job;
 52     }
 53 }
 54 
 55 class userFactory {
 56     static public function createUser($properties = []) {
 57         return new User($properties['username'], $properties['gender'], $properties['job']);
 58     }
 59 }
 60 
 61 $employers = [
 62     ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
 63     ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
 64     ];
 65 $user = userFactory::createUser($employers[0]);
 66 echo $user->getUsername();
 67 
 68 /**
 69  * 工厂方法模式
 70  **/
 71 interface userProperties {
 72     function getUsername();
 73     function getGender();
 74     function getJob();
 75 }
 76 
 77 interface createUser {
 78     function create($properties);
 79 }
 80 
 81 class User implements userProperties{
 82     private $username;
 83     private $gender;
 84     private $job;
 85     public function __construct($username, $gender, $job) {
 86         $this->username = $username;
 87         $this->gender = $gender;
 88         $this->job = $job;
 89     }
 90 
 91     public function getUsername() {
 92         return $this->username;
 93     }
 94 
 95     public function getGender() {
 96         return $this->gender;
 97     }
 98 
 99     public function getJob() {
100         return $this->job;
101     }
102 }
103 
104 class userFactory {
105     private $user;
106     public function __construct($properties = []) {
107         $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
108     }
109 
110     public function getUser() {
111         return $this->user;
112     }
113 }
114 
115 class FactoryMan implements createUser {
116     function create($properties) {
117         return new userFactory($properties); 
118     }
119 } 
120 
121 class FactoryWoman implements createUser {
122     function create($properties) {
123         return new userFactory($properties);
124     }
125 }
126 
127 class clientUser {
128     static public function getClient($properties) {
129         $fac = new FactoryMan;
130         $man = $fac->create($properties);
131         echo $man->getUser()->getUsername();
132     }
133 }
134 
135 $employers = [
136     ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
137     ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
138     ];
139 $user = clientUser::getClient($employers[0]);
140 
141 /**
142  * 抽象工厂模式
143  * */
144 
145 interface userProperties {
146     function getUsername();
147     function getGender();
148     function getJob();
149 }
150 
151 interface createUser { //将对象的创建抽象成一个接口
152     function createOpen($properties);//内向创建
153     function createIntro($properties);//外向创建
154 }
155 
156 class User implements userProperties{
157     private $username;
158     private $gender;
159     private $job;
160     public function __construct($username, $gender, $job) {
161         $this->username = $username;
162         $this->gender = $gender;
163         $this->job = $job;
164     }
165 
166     public function getUsername() {
167         return $this->username;
168     }
169 
170     public function getGender() {
171         return $this->gender;
172     }
173 
174     public function getJob() {
175         return $this->job;
176     }
177 }
178 
179 class userFactory {
180     private $user;
181     public function __construct($properties = []) {
182         $this->user =  new User($properties['username'], $properties['gender'], $properties['job']);
183     }
184 
185     public function getUser() {
186         return $this->user;
187     }
188 }
189 
190 class FactoryMan implements createUser {
191     function createOpen($properties) {
192         return new userFactory($properties); 
193     }
194 
195     function createIntro($properties) {
196         return new userFactory($properties); 
197     }
198 } 
199 
200 class FactoryWoman implements createUser {
201     function createOpen($properties) {
202         return new userFactory($properties);
203     }
204 
205     function createIntro($properties) {
206         return new userFactory($properties);
207     }
208 }
209 
210 class clientUser {
211     static public function getClient($properties) {
212         $fac = new FactoryMan;
213         $man = $fac->createOpen($properties);
214         echo $man->getUser()->getUsername();
215     }
216 }
217 
218 $employers = [
219     ['username' => 'Jack', 'gender' => 'male', 'job' => 'coder'],
220     ['username' => 'Marry', 'gender' => 'female', 'job' => 'designer'],
221     ];
222 $user = clientUser::getClient($employers[0]);

 

posted @ 2018-03-26 16:48  范仁义  阅读(434)  评论(0编辑  收藏  举报