工厂方法模式

<?php
/**
 * 操作抽象类
 */
abstract class op {
    public $op_num_1;
    public $op_num_2;
    abstract function get_result();    
} 
/**
 * 执行具体运算的加法类
 */
class op_add extends op {
    public function get_result() {
        echo $this->op_num_1 + $this->op_num_2,chr(10);
    }
}
/**
 * 执行具体运算的减法类
 */
class op_subtract extends op {
    public function get_result() {
        echo $this->op_num_1 - $this->op_num_2,chr(10);
    }
}
/**
 * 创建执行具体运算的对象的抽象工厂类
 */
abstract class op_factory {
    abstract function create_op();
}
/**
 * 创建执行加法运算的对象的类
 */
class op_add_factory extends op_factory {
    public function create_op() {
        return new op_add();
    }
}
/**
 * 创建执行减法运算的对象的类
 */
class op_subtract_factory extends op_factory {
    public function create_op() {
        return new op_subtract();
    }
}
//通过加法工厂创建一个执行加法运算的对象
$op_add = new op_add_factory();
$op = $op_add->create_op();
//执行运算
$op->op_num_1 = 100;
$op->op_num_2 = 50;
$op->get_result();

/*
简单工厂模式中对象的创建逻辑在工厂类内部。如果新增某项功能, 需要添加功能实现类,修改工厂类内部的对象创建逻辑。这样违背了面向对象的“开放-封闭原则”。
工厂方法模式,将对象的创建逻辑延迟到工厂类的子类中。如果新增某项功能,它只需添加功能实现类,添加工厂方法子类用于创建新增的个功能实现类的对象。
但是具体调用哪个工厂子类来创建具体功能对象的逻辑,貌似交还给了客户端。
*/

工厂方法模式(factory method): 定义一个创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

posted @ 2015-07-08 13:38  扬空  阅读(171)  评论(0编辑  收藏  举报