PHP设计模式-工厂系列(一)-简单工厂模式(静态工厂模式)

本文介绍了简单工厂模式的概念及其在PHP中的应用。通过一个玩具工厂的例子,详细解释了如何使用简单工厂模式来创建对象,以及该模式的优势和适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        在设计模式中,工厂模式有三种,即:简单工厂模式、工厂方法模式  [ 附:PHP设计模式-工厂方法模式 ]  和 抽象工厂模式 [附:PHP设计模式-抽象工厂模式 ] 。那么,为什么取名叫叫工厂呢?我们都知道,工厂是生产产品的地方。给这些设计模式取名工厂的意思也就是告诉大家,这三种模式其实就是为了生产产品(即创建对象)。而且,这三者之中,以简单工厂最为简单(有点废话了)。

        那么,什么是简单工厂呢?简单工厂就是,告诉工厂我要生产的产品的名字,你给我生产出相应的产品出来(即告诉对象名,创建对象)。举个例子,有一个玩具工厂,有很多车间,可以生产狗,熊,猫三种玩具。那么,我们有如下定位:

class DogToy
{

}

class CatToy {

}

class BearToy
{

}

        当我们需要生产一个猫玩具的时候,可以用new CatToy(), 生成狗玩具的时候可以用new DogToy(), ...。这样,看起来,好像也没有什么问题。但,如果我是公司的领导,我就得先找到生产狗玩具的车间,告诉他们,给我生产狗玩具。如果我要生产熊和猫也一样。那这样是不是很累?那领导说话了,不行,这种事怎么能让我去干?我还有好多事儿要做呢。具体该如何操作,还是让车间主管去处理吧。于是任命了一个车间主管。而车间主管的职责就是随时候命,需要生产什么你就去处理。

class FactoryManager
 {
	public function make()
	{
		
	}
 }

    领导告诉你要生产什么,只要告诉主管要生产的玩具的名字就可以了,其它该怎么生产由主管去联系车间负责生产。

 class FactoryManager
 {
	 
	//你让我生产什么,告诉我玩具的名字就可以了
	public static function make($toyName)
	{
		switch ($toyName) {
			case "cat":
				return new CatToy();
			case "bear":
				return new BearToy();
			case "dog":
				return new DogToy();
		}
	}
 }

        如果领导告诉我们,需要生产驴玩具,但我们生产不了这种玩具。那得告诉领导吧。所以我们需要存一份我们能生成的列表。另外,我们需要稍微整理一下。因为要生产的玩具名称和类名很有规律(玩具名首字母大写后加一个Toy就可以了)。于是有如下代码:

class DogToy
{

}

class CatToy
{

}

class BearToy
{

}

class FactoryManager
{

   //指定我们工厂可以生产的玩具类型
   public static $allowToyName = array(
       "bear", "cat", "dog"
   );

   //你让我生产什么,告诉我玩具的名字就可以了
   public static function make($toyName)
   {
       //检查这种玩具是否能生产
       $toyName = strtolower($toyName);
       if (!in_array($toyName, self::$allowToyName)) {
           throw new Exception("没法生产这种玩具");
       }

	   //生产玩具
       $className = ucfirst($toyName).'Toy';
       return new $className();
   }
}

        从上面代码可以看出来。所有的创建对象的工作,都交给了工厂的主管来做。它负责每个产品的生产情况。领导不用关心,只关心我要什么产品就可以了---这就是简单工厂模式的好处.而且我们发现,工厂能生产什么样的玩具,这个需要可控。也就是说,对于简单工厂模式来说,它适用于创建的对象类型可能比较少。同时,我们可以看到,这种简单工厂,就是依靠一个创建对象的类里面的一个静态方法来创建需要的对象。因此我们也把简单工厂叫做:静态工厂方法.


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值