首页 PHP 正文
215

设计模式之抽象工厂模式

抽象工厂模式由以下几部分组成:
1、抽象工厂,可以是抽象类或者接口,它里面定义了一组生产不同产品的方法。
2、具体工厂类,每一个具体工厂类负责生产具体的产品类型。
3、抽象产品,一般有多个。它们构成了整个产品族。
4、具体产品类,产品族包括很多产品树,每一个产品树都有多个叶子产品。
可能文字描述比较难懂,打个比方来说,一个生产校服的工厂,它必须生产两种产品,一种是上衣,一种是裤子。所以上衣和裤子构成了这个工厂的产品组群。但是对于上衣来说,它也有多种不同款式的上衣,同样,裤子也有多种款式的裤子。比如,现在工厂要生产两套校服:民国风校服和现代风校服。那么就应该有两个具体的工厂类,一个是生产民国风校服的工厂,它负责生产民国风的上衣和民国风的裤子。另一个是生产现代风校服的工厂,它负责生产现代风的上衣和现代风的裤子。
/**
*抽象工厂
*/
interface AbstractFactory{
    public function createClothes(); //生产衣服
    public function createTrousers();//生产裤子
}

/**
*具体工厂A
*/
class ConcreteFactoryA implements AbstractFactory{
    public function createClothes(){ //生产衣服A
        return new ClothesA();
    } 
    public function createTrousers(){ //生产裤子A
        return new TrousersA();
    }
}

/**
*具体工厂B
*/
class ConcreteFactoryB implements AbstractFactory{
    public function createClothes(){ //生产衣服B
        return new ClothesB();
    } 
    public function createTrousers(){ //生产裤子B
        return new TrousersB();
    }
}

/**
*抽象衣服类
*/
interface AbstractClothes{
    public function show();
}

/**
*衣服A
*/
class ClothesA implements AbstractClothes{
    public function show(){
        echo 'This is clothesA<br>';
    }
}

/**
*衣服B
*/
class ClothesB implements AbstractClothes{
    public function show(){
        echo 'This is clothesB<br>';
    }
}

/**
*抽象裤子类
*/
interface AbstractTrousers{
    public function show();
}

/**
*裤子A
*/
class TrousersA implements AbstractTrousers{
    public function show(){
        echo 'This is trousersA<br>';
    }
}

/**
*裤子B
*/
class TrousersB implements AbstractTrousers{
    public function show(){
        echo 'This is trousersB<br>';
    }
}

//生产A套产品(包括衣服A,裤子A)
$factoryA = new ConcreteFactoryA();
$clothesA = $factoryA->createClothes();
$clothesA->show();
$trousersA = $factoryA->createTrousers();
$trousersA->show();

//生产B套产品(包括衣服B,裤子B)
$factoryB = new ConcreteFactoryB();
$clothesB = $factoryB->createClothes();
$clothesB->show();
$trousersB = $factoryB->createTrousers();
$trousersB->show();
抽象工厂模式中所有产品都应该有一定的联系,当替换其中一种产品时,其它产品也要跟着替换,这样才可以将这些独立的产品捆绑在同一个工厂中生产。《大话设计模式》一书中有个抽象工厂模式的例子,说的是access数据库换成sqlServer数据库时就是这种情形,数据库一换,所有的表对象都得跟着变化,那么这些表对象的创建方法就可以捆绑在一个工厂里面,数据库更换只要将工厂替换就可以了。

正在加载评论...