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
     ?>
    

      

  • 相关阅读:
    程序员私活话题
    关于未来房价
    关于.net core 中的signalR组件的使用
    typescript nodejs 依赖注入实现
    .net core mvc启动顺序以及主要部件4-MVC
    .net core mvc启动顺序以及主要部件3-Startup
    .net core mvc启动顺序以及主要部件2
    .net core mvc启动顺序以及主要部件1
    关于.NET HttpClient方式获取微信小程序码(二维码)
    ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用
  • 原文地址:https://www.cnblogs.com/-beyond/p/7753665.html
Copyright © 2011-2022 走看看