zoukankan      html  css  js  c++  java
  • 工厂模式

    简单工厂模式是将业务逻辑包含在一个类中,使用的时候直接调用接口,传一个参数进去,然后获得对应的对象,但是当要创建的产品对象的种类发生改变(增加或者减少),都要通过修改工厂类,这就不符合开闭原则(对修改关闭,对扩展开放)了。

    工厂模式与简单工厂模式的去别就在于,如果要创建的产品对象的种类发生改变,我们只需要定义一个该类对象的一个工厂,用来专门生产这种对象。如果有疑问,可以看一下这篇博文:简单工厂模式

    比如,有水果这个基类,这个基类有苹果和香蕉,那么用简单工厂模式,可以用下面的代码实现

    <?php 
    	abstract class Fruit{
    		abstract public function say();
    	}
    
    	class Apple extends Fruit{
    		public function say(){
    			echo "I'm Apple
    ";
    		}
    	}
    
    	class Banana extends Fruit{
    		public function say(){
    			echo "I'm banana
    ";
    		}
    	}
    
    	class Factory{
    		public function getFruit($fruit){
    			if($fruit=="Apple"){
    				return new Apple;
    			} else if($fruit == "Banana"){
    				return new Banana;
    			} else {
    				return NULL;
    			}
    		}
    	}
    
    	//创建一个工厂
    	$factory=new Factory();
    
    	$fruit=$factory->getFruit("Apple");
    	$fruit->say();//I'm Apple
    
    	$fruit=$factory->getFruit("Banana");
    	$fruit->say();//I'm banana
    
     ?>
    

     那么现在又有一个水果梨,要获得梨对象,如果用简单工厂模式,如上面的代码,那就得现定义一个梨的类,然后修改factory工厂类,加一个判断条件,如果$fruit==pear,则返回一个梨对象。

    现在用工厂模式,只需要定义一个梨的类,然后再定义一个抽象工厂类,然后再定义一个生产梨的工厂类,直接用生产梨工厂去生产梨,以后每增加一种水果,只需要重复做这些工作即可,不用对工厂类进行修改。比如下面的代码

    <?php 
    	//创建水果基类
    	abstract class Fruit{
    		abstract public function say();
    	}
    	//创建一个苹果类
    	class Apple extends Fruit{
    		public function say(){
    			echo "I'm Apple
    ";
    		}
    	}
    	//创建一个香蕉类
    	class Banana extends Fruit{
    		public function say(){
    			echo "I'm banana
    ";
    		}
    	}	
    	//新增了一个梨类
    	class Pear extends Fruit{
    		public function say(){
    			echo "I'm pear
    ";
    		}
    	}
    	//创建一个抽象工厂来
    	abstract class Factory{
    		abstract public function getFruit();
    	}
    	//创建苹果工厂类
    	class AppleFactory extends Factory{
    		public function getFruit(){
    			return new Apple;
    		}
    	} 
    	//创建香蕉工厂类
    	class BananaFactory extends Factory{
    		public function getFruit(){
    			return new Banana;
    		}
    	} 
    	//新建一个梨工厂类
    	class PearFactory extends Factory{
    		public function getFruit(){
    			return new Pear;
    		}
    	}
    
    	$factory=new AppleFactory();
    	$fruit=$factory->getFruit();
    	$fruit->say();//I'm Apple
    
    	$factory=new BananaFactory();
    	$fruit=$factory->getFruit();
    	$fruit->say();//I'm banana
    
    	$factory=new PearFactory();
    	$fruit=$factory->getFruit();
    	$fruit->say();//I'm pear
     ?>
    

      

  • 相关阅读:
    硬盘坏道及后续的拯救工作
    Extension GL_VERSION_1_2 could not be loaded.
    js显示当前的年月日时分秒
    如何删除桌面上的回收站?
    Fedora 15 U盘 安装心得
    庄子·内篇·逍遥游
    Additional Oracle Performance Extensions
    Features Specific to JDBC OCI Driver
    OracleDatabase 配置
    vim字符编码设置
  • 原文地址:https://www.cnblogs.com/-beyond/p/7753665.html
Copyright © 2011-2022 走看看