再一次读 工厂模式

来源:互联网 发布:淘宝有货到付款吗 编辑:程序博客网 时间:2024/05/17 08:54
由于缺乏实践经验,对设计模式的理解总是浑浑噩噩。

********
工厂模式定义:实例化对象,用工厂方法代替new操作.

工厂模式(Factory)允许你在代码执行时实例化对象。它之所以被称为工厂模式是因为它负责“生产”对象。工厂方法的参数是你要生成的对象对应的类名称。 
********
************************
工厂方法模式:解决了当代码关注于抽象类型时如何创建对象实例的问题。
答案:用特定的类来处理实例化。

实现:工厂方法模式把创建者类与要生产的产品类分离开来。创建者是一个工厂类,其中定义了用于生成产品对象的类方法。如果没有提供默认实现,那么就由创建者类的子类来执行实例化。
一般情况下,就是创建者类的每个子类实例化一个相应产品子类。

<?php
/*
* 抽象产品类
*/
abstract class ApptEncoder{
abstract function encode();
}

class BloggsApptEncoder extends ApptEncoder{

function encode(){
return "Apponitment data encode in BloggsCal format\n<br>";
}
}

abstract class CommsManager {

abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getFooterText();
}

class BloggsCommsManager extends CommsManager {
function getHeaderText(){
return "BloggsCal header\n <br>";
}

function getApptEncoder(){
return new BloggsApptEncoder();
}

function getFooterText(){
return "BloggsCal footer\n<br>";
}
}

$fac = new BloggsCommsManager();
//客户端代码直接调用 生成的对象直接调用 产品抽象类的encode()方法,不需要知道具体的产品
$pro = $fac->getApptEncoder();
echo $fac -> getHeaderText();
echo $pro -> encode();
echo $fac -> getFooterText();


该模式会导致不必要的子类化。
************************

抽象工厂模式: 
需要工厂生产一组相关的类。

预约(Appt)、代办事宜(Ttd)、联系人(Contact).

BloggsCommsManager:具体的创建者类
ApptEncoder、TtdEncoder、ContactEncoder 3个将被创建的产品类

<?php
/**
* 抽象工厂模式
* @author GaoZhen'an <gaoce227@hotmail.com>
* @version $Id: 02.php $
*/
abstract class CommsManager {
abstract function getHeaderText();
abstract function getApptEncoder();
abstract function getTtdEncoder();
abstract function getContactEncoder();
abstract function getFooterText();
}

class BloggsCommsManager extends CommsManager {

function getHeaderText(){
return "BloggsCal header <br>";
}

function getApptEncoder() {
return new BloggsApptEncoder();
}

function getTtdEncoder() {
return new BloggsTtdEncoder();
}

function getContactEncoder() {
return new BloggsContactEncoder();
}

function getFooterText() {
return "BloggsCal footer <br>";
}
}