-
目的
1.在不指定具体类的情况下创建一系列相关或依赖对象。 通常创建的类都实现相同的接口。 抽象工厂的客户并不关心这些对象是如何创建的,它只是知道它们是如何一起运行的。
-
主要角色
1.抽象工厂角色(Abstract Factory)声明抽象工厂接口,所有的具体工厂类必须实现这个接口或者继承这个类
2.具体工厂角色(Concrete Factory)实现产品对象的操作,客户端调用直接生成产品
3.抽象产品(Abstract Project)声明一个类产品的接口,它是工厂方法模式所创建的对象的父类,或它们共同拥有的接口。
4.具体产品(Concrete Project)实现抽象产品的接口,定义一个将被具体工厂所创建出来的产品对象 -
优缺点
1.增加替换产品变得更加容易,
2.有利于产品的一致性(DB)
3.难以支持新品类,这是因为抽象工厂(Abstruct Factory)已经确定了产品集合,如果支持新个类,就要拓展新的访问工厂接口,从而导致了抽象工厂类(Abstruct Factory)及其所有子类改变.
4.抽象工厂就是以一种倾斜的方式支持增加新产品中,他为新产品组中的增加添加了方便,而不能为新产品结构改变. -
用反射优化抽象工厂
-
代码1
<?php
/**
* 抽象工厂模式
* -------------
* @author zhaoxuejie <zxj198468@gmail.com>
* @package design pattern
* @version v1.0 2011-12-14
*/
//抽象工厂
interface AnimalFactory {
public function createCat();
public function createDog();
}
//具体工厂
class BlackAnimalFactory implements AnimalFactory {
function createCat(){
return new BlackCat();
}
function createDog(){
return new BlackDog();
}
}
class WhiteAnimalFactory implements AnimalFactory {
function createCat(){
return new WhiteCat();
}
function createDog(){
return new WhiteDog();
}
}
//抽象产品
interface Cat {
function Voice();
}
interface Dog {
function Voice();
}
//具体产品
class BlackCat implements Cat {
function Voice(){
echo '黑猫喵喵……';
}
}
class WhiteCat implements Cat {
function Voice(){
echo '白猫喵喵……';
}
}
class BlackDog implements Dog {
function Voice(){
echo '黑狗汪汪……';
}
}
class WhiteDog implements Dog {
function Voice(){
echo '白狗汪汪……';
}
}
//客户端
class Client {
public static function main() {
self::run(new BlackAnimalFactory());
self::run(new WhiteAnimalFactory());
}
public static function run(AnimalFactory $AnimalFactory){
$cat = $AnimalFactory->createCat();
$cat->Voice();
$dog = $AnimalFactory->createDog();
$dog->Voice();
}
}
Client::main();
?>
网友评论