邢栋博客
邢栋博客,Action博客,记录工作和生活中的点点滴滴
php简单工厂、工厂模式、抽象工厂实例总结
简单工厂
<?php /** * Created by PhpStorm. * User: xingdong * Date: 2019/8/3 * Time: 上午10:05 */ //简单工厂 interface Product { public function getPrice(); public function getName(); } class ProductA implements Product { public function getPrice() { return 100; } public function getName() { return 'ProductA'; } } class ProductB implements Product { public function getPrice() { return 200; } public function getName() { return 'ProductB'; } } class ProductC implements Product { public function getPrice() { return 300; } public function getName() { return 'ProductC'; } } class Factory { public static function createProduct($type) { $product = null; switch ($type){ case "A": $product = new ProductA(); break; case "B": $product = new ProductB(); break; case "C": $product = new ProductC(); break; } return $product; } } $productA = Factory::createProduct('A'); $productB = Factory::createProduct('B'); $productC = Factory::createProduct('C'); /** * 以上便是简单工厂模式的一个典型事例,当用户需要新增产品ProductD时,必须在工厂类的生产方法中增加 对应的判断分支,所以简单工厂模式违背了开放封闭原则。 简单工厂模式,利用静态方法根据输入参数生成对应的产品,隐藏了产品实例化的细节。 总结: 简单工厂模式最大的优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类, 对于客户端来说,去除了与具体产品的依赖。但是当需求变动的时候,需要对原有的类进行修改,违背了开放封闭原则。 * * */工厂模式
<?php /** * Created by PhpStorm. * User: xingdong * Date: 2019/8/3 * Time: 上午10:05 */ //工厂方式模式 interface Product { public function getPrice(); public function getName(); } class ProductA implements Product { public function getPrice() { return 100; } public function getName() { return 'ProductA'; } } class ProductB implements Product { public function getPrice() { return 200; } public function getName() { return 'ProductB'; } } class ProductC implements Product { public function getPrice() { return 300; } public function getName() { return 'ProductC'; } } interface IFactory{ public function createProduct(); } class FactoryA implements IFactory { public function createProduct() { return new ProductA(); } } class FactoryB implements IFactory { public function createProduct() { return new ProductB(); } } class FactoryC implements IFactory { public function createProduct() { return new ProductC(); } } $factoryA = new FactoryA(); $factoryA->createProduct(); $factoryB = new FactoryB(); $factoryB->createProduct(); $factoryC = new FactoryC(); $factoryC->createProduct(); /** * 当需要增加一个新产品ProductD,只需要新建对应的FactoryD来实现生产功能即可,对原有的代码 没有任何影响,非常符合开放封闭原则,但是由于每增加一个产品,都需要新增对应的生产工厂,导致增加额外的开发工作量。 总结:由于使用了多态,工厂方法克服了简单工厂违背的开放封闭原则的缺点,又保持了封装对象创建过程的优点。 */抽象工厂
<?php /** * Created by PhpStorm. * User: xingdong * Date: 2019/8/3 * Time: 上午10:05 */ //抽象工厂方式 //商品 interface Product { public function getPrice(); public function getName(); } class ProductA implements Product { public function getPrice() { return 100; } public function getName() { return 'ProductA'; } } class ProductB implements Product { public function getPrice() { return 200; } public function getName() { return 'ProductB'; } } class ProductC implements Product { public function getPrice() { return 300; } public function getName() { return 'ProductC'; } } //礼品 interface Gift { public function getGiftName(); } class GiftA implements Gift { public function getGiftName() { return 'GiftA'; } } class GiftB implements Gift { public function getGiftName() { return 'GiftB'; } } class GiftC implements Gift { public function getGiftName() { return 'GiftC'; } } interface IFactory{ public function createProduct(); public function createGift(); } class FactoryA implements IFactory { public function createProduct() { return new ProductA(); } public function createGift() { return new GiftA(); } } class FactoryB implements IFactory { public function createProduct() { return new ProductB(); } public function createGift() { return new GiftB(); } } class FactoryC implements IFactory { public function createProduct() { return new ProductC(); } public function createGift() { return new GiftC(); } } $factoryA = new FactoryA(); $factoryA->createProduct(); $factoryB = new FactoryB(); $factoryB->createProduct(); $factoryC = new FactoryC(); $factoryC->createProduct(); /** * 总结:抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类。 抽象工厂接口,应该包含所有的产品创建的抽象方法,我们可以定义实现不止一个接口, 一个工厂也可以生产不止一种产品类,和工厂方法模式一样,抽象工厂模式同样实现了开发封闭原则 */
php设计模式之工厂模式简单事例
<?php //工厂模式 class Automobile { private $vehicleMake; private $vehicleModle; public function __construct($make,$model) { $this->vehicleMake = $make; $this->vehicleModle = $model; } public function getMakeAndModel() { return $this->vehicleMake.' '.$this->vehicleModle; } } class AutomobileFactory { public static function create($make,$model) { return new Automobile($make,$model); } } $veyron = AutomobileFactory::create('Bugatti','Veyron'); print_r($veyron->getMakeAndModel()); ?>
上面的代码用来一个工厂来创建 Automobile 对象。用这种方式创建对象有两个好处: 首先,如果你后续需要更改,重命名或替换 Automobile 类,你只需要更改工厂类中的代码,而不是在每一个用到 Automobile 类的地方修改; 其次,如果创建对象的过程很复杂,你也只需要在工厂类中写,而不是在每个创建实例的地方重复地写。