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数据库时就是这种情形,数据库一换,所有的表对象都得跟着变化,那么这些表对象的创建方法就可以捆绑在一个工厂里面,数据库更换只要将工厂替换就可以了。