zoukankan      html  css  js  c++  java
  • PHP设计模式一:工厂方法设计模式

    一、什么是工厂方法模式

      作为一种创建型设计模式,工厂方法模式就是要创建“某种东西”。对于工厂方法,要创建的“东西”是一个产品,这个产品与创建它的类之间不存在绑定。实际上,为了保持这种松耦合,客户会通过一个工厂发出请求,再由工厂创建所请求的产品。利用工厂方法模式,请求者只发出请求,而不具体创建产品。

     

    二、什么时候使用工厂方法模式

      如果实例化对象的子类可能改变,就要使用工厂方法模式。

     

    三、一般工厂方法模式

      使用一般工厂方法模式时,客户只包含工厂的引用,一个工厂生产一种产品。增加一种产品的同时需要增加一个新工厂类和一个新产品类。

    <?php
    /**
    *	一般工厂方法设计模式
    **/
    
    //工厂抽象类
    abstract class Factory
    {
    	protected abstract function produce();
    
    	public function startFactory()
    	{
    		$pro = $this->produce();
    		return $pro;
    	}
    }
    
    //文本工厂
    class TextFactory extends Factory
    {
    	protected function produce()
    	{
    		$textProduct = new TextProduct();
    		return $textProduct->getProperties();
    	}
    }
    
    //图像工厂
    class ImageFactory extends Factory
    {
    	protected function produce()
    	{
    		$imageProduct = new ImageProduct();
    		return $imageProduct->getProperties();
    	}
    }
    
    //产品类接口
    interface Product
    {
    	public function getProperties();
    }
    
    //文本产品
    class TextProduct implements Product
    {
    	private $text;
    
    	function getProperties()
    	{
    		$this->text = "此处为文本";
    		return $this->text;
    	}
    }
    
    //图像产品
    class ImageProduct implements Product
    {
    	private $image;
    
    	function getProperties()
    	{
    		$this->image = "此处为图像";
    		return $this->image;
    	}
    }
    
    //客户类
    class Client
    {
    	private $textFactory;
    	private $imageFactory;
    
    	public function __construct()
    	{
    		$this->textFactory = new TextFactory();
    		echo $this->textFactory->startFactory() . '<br />';
    
    		$this->imageFactory = new ImageFactory();
    		echo $this->imageFactory->startFactory() . '<br />';
    	}
    }
    
    $client = new Client();
    ?>
    

      

    四、参数化工厂方法模式

      使用参数化工厂方法模式时,客户包含工厂和产品的引用,发出请求时需要指定产品的种类,一个工厂生产多种产品。增加一种产品时只需要增加一个新产品类即可。

    <?php
    /**
    *	参数化工厂方法设计模式
    **/
    
    //工厂抽象类
    abstract class Factory
    {
    	protected abstract function produce(Product $product);
    
    	public function startFactory(Product $product)
    	{
    		$pro = $this->produce($product);
    		return $pro;
    	}
    }
    
    //工厂实现
    class ConcreteFactory extends Factory
    {
    	protected function produce(Product $product)
    	{
    		return $product->getProperties();
    	}
    }
    
    //产品类接口
    interface Product
    {
    	public function getProperties();
    }
    
    //文本产品
    class TextProduct implements Product
    {
    	private $text;
    
    	public function getProperties()
    	{
    		$this->text = "此处为文本";
    		return $this->text;
    	}
    }
    
    //图像产品
    class ImageProduct implements Product
    {
    	private $image;
    
    	public function getProperties()
    	{
    		$this->image = "此处为图像";
    		return $this->image;
    	}
    }
    
    //客户类
    class Client
    {
    	private $factory;
    	private $textProduct;
    	private $imageProduct;
    
    	public function __construct()
    	{
    		$factory = new ConcreteFactory();
    		$textProduct = new TextProduct();
    		$imageProduct = new ImageProduct();
    
    		echo $factory->startFactory($textProduct) . '<br />';
    		echo $factory->startFactory($imageProduct) . '<br />';
    	}
    }
    
    $client = new Client();
    ?>
    

      

     

  • 相关阅读:
    C#开发ActiveX可行性研究 简单飞扬
    有几件事情 简单飞扬
    1 简单飞扬
    宁静 会一直存在么 简单飞扬
    java 项目中遇到的错误 简单飞扬
    开发线程安全的Spring Web应用(转) 简单飞扬
    p2p网站即时通信 简单飞扬
    游戏外挂原理和技术分析(关于魔力宝贝) 简单飞扬
    关于java使用javacomm20win32实践总结 (转) 简单飞扬
    Java 串口编程 简单飞扬
  • 原文地址:https://www.cnblogs.com/wujuntian/p/4901582.html
Copyright © 2011-2022 走看看