概念理解
抽象工厂模式:生产出不同业务品种的不同业务分类,强调的是每个不同品种下的分类,而他的生产类中是按照业务分类来区别的,就像《设计模式之禅》举的例子,有奔驰车和宝马车,这个车强调的就是业务品种,要生产车门(车门就是业务分类),但是车门分为左侧车门个右侧车门。估计看到这个定义会不太理解,但通过阅读代码在回头看,就会很好理解。
类图
代码实现
1.java
产品A抽象类
public abstract class AbsProductA {
public void commonFunction(){}
public abstract void doSomething();
}
产品B抽象类
public abstract class AbsProductB {
public void commonFunction(){}
public abstract void doSomething();
}
A产品分类1实现类
public class ProductA1 extends AbsProductA {
@Override
public void doSomething() {
System.out.print("A1");
}
}
A产品分类2实现类
public class ProductA2 extends AbsProductA {
@Override
public void doSomething() {
System.out.print("A2");
}
}
B产品分类1实现类
public class ProductB1 extends AbsProductB{
@Override
public void doSomething() {
System.out.print("B1");
}
}
B产品分类2实现类
public class ProductB2 extends AbsProductB{
@Override
public void doSomething() {
System.out.print("B2");
}
}
工厂抽象类
public abstract class AbsCreater {
public abstract AbsProductA createProductA();
public abstract AbsProductB createPriductB();
}
分类1工厂类
public class Creater1 extends AbsCreater {
@Override
public AbsProductA createProductA() {
return new ProductA1();
}
@Override
public AbsProductB createPriductB() {
return new ProductB1();
}
}
分类2工厂类
public class Creater2 extends AbsCreater {
@Override
public AbsProductA createProductA() {
return new ProductA2();
}
@Override
public AbsProductB createPriductB() {
return new ProductB2();
}
}
2.php
abstract class AbsProductA
{
public function commomFunction(){}
public abstract function doSomething();
}
abstract class AbsProductB
{
public function commonFunction(){}
public abstract function doSomething();
}
class ProductA1 extends AbsProductA
{
public function doSomething()
{
echo 'A1';
}
}
class ProductA2 extends AbsProductA
{
public function doSomething()
{
echo 'A2';
}
}
class ProductB1 extends AbsProductB
{
public function doSomething()
{
echo 'B1';
}
}
class ProductB2 extends AbsProductB
{
public function doSomething()
{
echo 'B2';
}
}
abstract class AbsCreater
{
public abstract function createA();
public abstract function createB();
}
class Creater1 extends AbsCreater
{
public function createA()
{
return new ProductA1();
}
public function createB()
{
return new ProductB1();
}
}
class Creater2 extends AbsCreater
{
public function createA()
{
return new ProductA2();
}
public function createB()
{
return new ProductB2();
}
}
$creater1 = new Creater1();
$creater1->createA()->doSomething();
$creater1->createB()->doSomething();
$creater2 = new Creater2();
$creater2->createA()->doSomething();
$creater2->createB()->doSomething();