面向对象设计模式-抽象工厂模式(PHP实现)

       抽象工厂模式是所有形态的工厂模式中最为抽象和最具有一般性的一种形态。抽象工厂模式是指当有多个抽象角色时,使用的一种工厂模式。抽象工厂模式可以向客户端提供一个接口,时客户端在不必制定产品的具体情况下,创建多个产品族中的产品对象。

工厂方法和抽象工厂对比:

工厂方法模式
一个抽象产品类,可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品的实例。
抽象工厂模式
多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。
一个抽象工厂类,可以派生出多个具体工厂类。
每个具体工厂类只能创建一个具体产品的实例。









区别:

1.工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。

2.工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。


代码实现:

├── AArticle.class.php  抽象文章类
├── ArticleAction.class.php   具体文章类
├── Article.class.php  文章类使用入口
├── AUser.class.php 抽象用户类
├── client.php   系统入口
├── Factory.class.php   工厂类,返回对个产品的对象
├── UserAction.class.php 具体用户类

└── User.class.php  用户类使用入口

对应UML图:


client.php

<?php
require 'AUser.class.php';  //接口
require 'UserAction.class.php';  //具体实现
require 'Factory.class.php';   //工厂类
require 'User.class.php';      //实体类,给客户端直接使用

$_user = new User();
echo $_user->selectUser();
echo "\n";
echo $_user->updateUser();
echo "\n";

Factory.class.php

<?php
class Factory{
    static public function getUser(){
        return new UserAction();
    }
    static public function getArticle(){
        return new ArticleAction();
    }
}

AUser.class.php

<?php
//抽象类,给子类提供接口
abstract class AUser{
    abstract public function selectUser();   //查找用户
    abstract public function updateUser();   //修改用户
    abstract public function deleteUser();   //删除用户
    abstract public function addUser();      //新增用户
}

UserAction.class.php

<?php
class UserAction extends AUser{
    public function selectUser(){
        return "查找用户";    
    }
    public function updateUser(){
        return "更新用户";
    }
    public function deleteUser(){
        return "删除用户";
    }
    public function addUser(){
        return "增加用户";
    }
}

User.class.php

<?php
class User{
    private $_obj;

    public function __construct(){
        $this->_obj = Factory::getUser();
    }

    public function selectUser(){
        return $this->_obj->selectUser();
    }
    public function updateUser(){
        return $this->_obj->updateUser();
    }
    public function deleteUser(){
        return $this->_obj->deleteUser();
    }
    public function addUser(){
        return $this->_obj->addUser();
    }
}

AArticle.class.php

<?php
//抽象类,给子类提供接口
abstract class AArticle{
    abstract public function selectArticle();   //查找文章
    abstract public function updateArticle();   //修改文章
    abstract public function deleteArticle();   //删除文章
    abstract public function addArticle();      //新增文章
}

ArticleAction.class.php

<?php
class ArticleAction extends AArticl{
    public function selectArticle(){
        return "查找文章";    
    }
    public function updateArticle(){
        return "更新文章";
    }
    public function deleteArticle(){
        return "删除文章";
    }
    public function addArticle(){
        return "增加文章";
    }
}
Article.class.php
<?php
class Article{
    private $_obj;

    public function __construct(){
        $this->_obj = Factory::getArticle();
    }

    public function selectArticle(){
        return $this->_obj->selectArticle();
    }
    public function updateArticle(){
        return $this->_obj->updateArticle();
    }
    public function deleteArticle(){
        return $this->_obj->deleteArticle();
    }
    public function addArticle(){
        return $this->_obj->addArticle();
    }
}




猜你喜欢

转载自blog.csdn.net/oschina_41731918/article/details/81053893