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]);