再一次读 工厂模式

由于缺乏实践经验,对设计模式的理解总是浑浑噩噩。

********
工厂模式定义:实例化对象,用工厂方法代替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>";
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值