PHP很简单PHP经验分享程序员技术栈

设计模式03--抽象工厂模式(Abstract Factory)

2019-06-03  本文已影响1人  四月不见

一、简介

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。

注意:这里和工厂方法的区别是:一系列(多个),而工厂方法只有一个。

二、类结构

抽象工厂模式结构如下:

角色 类别 简述
AbstractFactory 抽象工厂 一般是一个抽象类或是接口
ConcreteFactory 具体工厂 用来创建一系列具体的产品
AbstractProduct 抽象产品 一个抽象类或是接口
Product 具体产品 用来创建具体的产品

三、UML图

比如,我们需要设计一个绘图工具:

四、类实现

1、抽象产品

图形类接口:

interface Shape{
    public function draw();
}

颜色类接口:

interface Color {
   public function fill();
}

2、具体产品

具体图形类:

//矩形类
class Rectangle implements Shape {
    public function draw() {
        echo '插入一个矩形 \n\r';
    }
}
//正方形类
class Square implements Shape {
    public function draw() {
        echo '插入一个正方形 \n\r';
    }
}
//圆形类
class Circle implements Shape {
    public function draw() {
        echo '插入一个圆形 \n\r';
    }
}

具体颜色类:

//红色类
class Red implements Color {
    public function fill() {
        echo '填充红色 \n\r';
    }
}
//绿色类
class Green implements Color {
    public function fill() {
        echo '填充绿色 \n\r';
    }
}
//蓝色类
class Blue implements Color {
    public function fill() {
        echo '填充蓝色 \n\r';
    }
}

3、抽象工厂

为 Color 和 Shape 对象创建抽象类来获取工厂。

class interface AbstractFactory {
   public function getColor($color);
   public function getShape($shape) ;
}

4、具体工厂

//形状工厂类
class ShapeFactory extends AbstractFactory {

    public function getShape($shapeType){
        if($shapeType == false){
            return false;
        }        
        if($shapeType=="circle"){
            return new Circle();
        } else if($shapeType=="rectangle"){
            return new Rectangle();
        } else if($shapeType=="square"){
            return new Square();
        }
        return false;
    }
    
    public function getColor($color) {
        return false;
    }
}

//颜色工厂类
class ColorFactory extends AbstractFactory {

    public function getShape($shapeType){
        return false;
    }
   
    public function getColor($color) {
        if($color == false){
            return false;
        }
        if($color=="red"){
            return new Red();
        } else if($color=="green"){
            return new Green();
        } else if($color=="blue"){
            return new Blue();
        }
        return false;
    }
}

5、工厂创造器

创建一个工厂创造器/生成器类,通过传递形状或颜色信息来获取工厂。

class FactoryProducer {
    public static function getFactory($choice){
        if($choice=="shape")){
            return new ShapeFactory();
        } else if($choice=="color"){
            return new ColorFactory();
        }
        return null;
    }
}

6、使用实例

public class Demo {
   public static function test() {
 
      //获取形状工厂
      $shapeFactory = FactoryProducer::getFactory("SHAPE");
      
      //为形状插入Circle对象
      $shape1 = $shapeFactory->getShape("circle");
      //调用 Circle 的 draw 方法
      $shape1->draw();
 
      //为形状插入Rectangle对象
      $shape2 = $shapeFactory->getShape("rectangle");
      //调用 Rectangle 的 draw 方法
      $shape2->draw();
      
      //获取颜色工厂
      $colorFactory = FactoryProducer::getFactory("color");
 
      //获取颜色为 Red 的对象
      $color1 = $colorFactory->getColor("red");
      //调用 Red 的 fill 方法
      $color1->fill();
   }
}

Demo::test();

测试结果:

插入一个圆形
插入一个矩形
填充红色

五、特点

1、优点

2、缺点

3、适用场景

在以下情况下可以考虑使用抽象工厂模式:

上一篇 下一篇

猜你喜欢

热点阅读