设计模式 一 简单工厂Simple Factory(工厂模式)

原创 2012年03月29日 10:20:47
<?php
/**
 * 简单工厂的演变
 */

 /**
  * 引导
  *
  * 1、当看到 “new”, 就会想到具体。导致代码更脆弱更缺乏弹性。,使用接口让代码具有弹性。
  * 2、针对接口编程,可以隔离掉以后系统可能发生的一大堆改变。why?如果代码是针对接口而写,那么通过多态,它可以与任何新类实现该接口。
  * 但是,当代码使用大量的具体类时,等于是自找麻烦,因为一旦加入新的具体类,就必须改变代码。也就是说,你的代码并非“对修改关闭”。想用新的具体类型来扩展代码,必须重新打开它。
  * 3、从封装特性,中寻找线索,找出会变化的方面,把它们从不变的部分分离出来。
 */


/**
 * 
 * 1、识别变化
 */

class PizzaStore {

	public function orderPizza() {			
		//为了让系统有弹性,我们很希望这是一个抽象类或接口。
		$pizza = new Pizza(); //变化部分

		$pizza->prepare(); //准备
		$pizza->bake(); //烘烤
		$pizza->cut(); //切片
		$pizza->box(); //包装
		return $pizza;
	}
}

/**
 * 当需要更多Pizza 类型时。。。
 * 必须添加一些代码,来“决定” 适合的比萨类型,然后再“制作”这个比萨。
 */

class PizzaStore {

	public function orderPizza($type) {
		
		if ("cheese" == $type) {//奶酪比萨
			$pizza = new CheesePizza(); 		
		} elseif ("greek" == $type) {//希腊比萨
			$pizza = new GreekPizza();		
		} elseif ("pepperoni" == $type) {//香肠比萨
			$pizza = new PepperoniPizza();		
		} else {
			//
		}

		$pizza->prepare();
		$pizza->bake();
		$pizza->cut();
		$pizza->box();
		return $pizza;
	}
}

/**
 * 明显可见,如果实例化“某些”具体类,将使orderPizza() 出现问题,而且也无法对orderPizza“修改关闭”。
 * 但是,现在我们已经知道哪些会改变,哪些不会改变,该是使用封装的时候了。
 */



/**
 * 封装创建对象的代码,创建比萨的代码转移到另一个对象中,由这个对象专职创建比萨。
 * 该对象称为“工厂”。
 */

class SimpleFactory {
	
	public function createPizza($type) {
		if ("cheese" == $type) {//奶酪比萨
			$pizza = new CheesePizza(); 		
		} elseif ("greek" == $type) {//希腊比萨
			$pizza = new GreekPizza();		
		} elseif ("pepperoni" == $type) {//香肠比萨
			$pizza = new PepperoniPizza();		
		} else {
			//
		}
		return $pizza;
	}
}

abstract class Pizza {
	public $name;
	public $price;
	abstract public function perpare();
	abstract public function bake();
	abstract public function cut();
	abstract public function box();
}

class CheesePizza extends Pizza {
	public $name;
	public $price;
	public function __construct() {
		$this->name = '奶酪比萨';
		$this->price = '10';
	}
	public function perpare() {

	}
	
	public function bake() {
		//TODO
	}
	
	public function cut() {
		//TODO
	}
	
	public function box() {
		//TODO
	}
	
	public function getName() {
		return $this->name;
	}
	//其他行为操作省略
}

class GreekPizza extends Pizza {
	public $name;
	public $price;
	public function __construct() {
		$this->name = '希腊比萨';
		$this->price = '5';
	}
	
	public function perpare() {
		//TODO
	}
	
	public function bake() {
		//TODO
	}
	
	public function cut() {
		//TODO
	}
	
	public function box() {
		//TODO
	}

	public function getName() {
		return $this->name;
	}
	//其他行为操作省略
}


/**
 * 问:我曾经看过一个类似的设计方式,把工厂定义成一个静态的方法。这有何差别?
 * 答:利用静态方法定义一个简单的工厂,这是个常见的技巧,常被成为“静态工厂”。为何使用静态方法?因为不需要使用创建对象来实例化对象。
 * 但请记住,这也有缺点,不能通过继承来改变创建方法的行为。
 */

 /**
  * 接下,重写PizzaStore 类.
  * 我们所要做的是仰仗工厂来为我们创建比萨。
  */
class PizzaStore {
	public $factory;
	public function __construct(SimpleFactory $simpleFactory ) {
		$this->factory = $simpleFactory;
	}
	
	public function orderPizza($type) {		
		//为了让系统有弹性,我们很希望这是一个抽象类或接口。
		$pizza = $this->factory->createPizza($type); //变化部分
		
		$pizza->perpare(); //准备
		$pizza->bake(); //烘烤
		$pizza->cut(); //切片
		$pizza->box(); //包装
		return $pizza;
	}
}

$simpleFactory = new simpleFactory();
$pizzaStore = new PizzaStore($simpleFactory);
$pizza = $pizzaStore->orderPizza('cheese');
echo $pizza->name.":".$pizza->price;

/**
 * 我们知道对象组合可以再运行时动态改变行为,因为我们可以更换不同的实现。在PizzaStore例子中要如何做到这点呢?有哪些工厂的实现能够被我们自由地更换?
 */


 /**
  * 总结:
  * 
  * 简单工厂(simple factory)
  * 1、simple factory 模式的工厂类根据提供给他的参数,返回几个可能产品类中的一个类的实例。通常它的返回的类都有一个公共的父类和公共的方法。
  * 2、simple factory 模式实际上不是gof 23个设计模式中的一员,反而比较像是一种编程习惯,但由于经常被使用,给他一个”荣誉奖“。不要因为不是设计模式而忽略它的用法。
  *
  * 具体结构如下:
  * -工厂类角色creator(SimpleFactory):工厂类在客户端直接控制下(create 方法)创建产品对象。
  * -抽象产品角色product(pizza):定义简单工厂创建对象的父类或者它们的共同拥有的接口。可以使抽象类也可以是接口。
  * -具体产品角色ConcreteProduct(CheesePizza) : 定义工厂创建的具体对象。
  * -客户端client(PizzaStore):工厂客户,通过客户端方法调用工厂创建实例。
  */




更多精彩 在 工厂方法


设计模式目录

相关文章推荐

JAVA设计模式之 简单工厂模式【Simple Factory Pattern】

一、概述 er、适用场景

java设计模式——简单工厂模式(Simple Factory Pattern)

定义:简单工厂模式(Simple Factory Pattern):又称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。在简单工            厂模 式中...

大话设计模式c++实现1——简单工厂模式 Simple Factory Pattern

问题:实现一个计算器控制台程序。 编程初学者会直觉地用计算机能够理解的逻辑来描述和表达解决问题的具体求解过程,这其实是用计算机的方式去思考。比如计算器程序,小要求输入两个数和运算符号,然后根据运算符号...

【JAVA设计模式】简单工厂模式(Simple Factory Pattern)

简单工厂设计模式,java实现
  • C_son
  • C_son
  • 2016年03月27日 11:03
  • 525

Net设计模式实例之简单工厂模式(Simple Factory Pattern)

Net设计模式实例之简单工厂模式(Simple Factory Pattern)一、简单工厂模式简介(Bref Introduction)       简单工厂模式(Simple Factory Pa...
  • jimtom
  • jimtom
  • 2011年05月19日 13:40
  • 155

[从零开始学设计模式-java]简单工厂模式(Simple Factory Method)

简单工厂模式意图 简单工厂模式的意图是定义一个用于创建对象的接口,并控制返回哪个类的实例。 简单工厂模式的角色分布以及各角色的职责: 工厂类(Factory):这是简单工厂模式的核心,用于负责控制...

java设计模式(1):简单工厂模式(Simple Factory)

设计模式主要分三个类型:创建型、结构型和行为型。 工厂模式属于创建型的设计模式 工厂模式主要是为创建对象提供过渡接口,以便创建对象具体过程屏蔽隔离起来,达到提高灵活性的目的。 其中工...
  • lwj0310
  • lwj0310
  • 2014年04月25日 17:36
  • 753

设计模式(创建型)之简单工厂模式(Simple Factory Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN。因为CSDN也支持MarkDown语法了,牛逼啊!概述简单工厂模式(Simple Factory Pattern)又叫...

设计模式之简单工厂模式(Simple Factory)

简单工厂模式是类的创建模式,也叫做静态工厂方法(static Factory Method)。通俗的讲,简单工厂模式就是由一个工厂类来判断到底可以提供什么样的产品。 工厂模式的特性: 我们...
  • love_99
  • love_99
  • 2013年04月18日 22:43
  • 486

Java设计模式:简单工厂模式(Simple Factory Pattern)

工厂模式: 1)简单工厂 2)工厂模式 简单工厂模式: 通常使用静态方法,因为这样它可以不需要创建对象;缺点:不能通过继承来改变创建方法的行为。 简单工厂其实不是一个设计模式,反而更像一种编程习惯...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:设计模式 一 简单工厂Simple Factory(工厂模式)
举报原因:
原因补充:

(最多只允许输入30个字)