php工厂模式设计问题

时间:2013-05-30 07:54:19

标签: php

我正在使用php学习工厂模式设计。我的应用程序所做的是显示不同的形状名称,例如Rectangle, Squares etcx, y位置。第一个用户将提供x和y值,它将与形状名称一起显示,例如Rectangle(2, 2)

我当前代码的问题在于它确实显示了形状名称,即Rectangle,但它没有显示用户提供的x和y值。为什么以及如何显示x和y值?

以下是我的代码 的index.php

    include_once("ConcreteCreator.php");
class Client {
    public function __construct() {
        $shapeNow = new ConcreteCreator();
        $display  = $shapeNow->factoryMethod(new Rectangle(2, 2));
        //Above I am passing x and y values in Rectangle(2, 2);
        echo $display . '<br>';
    }    
}

$worker = new Client();

这是ConcreteCreator.php

    include_once('Creator.php');
include_once('Rectangle.php');
class ConcreteCreator extends Creator {

    public function factoryMethod(Product $productNow) {
        //echo $productNow;
        $this->createdProduct = new $productNow;
        return $this->createdProduct->provideShape();
    }

}

这是Creator.php

abstract class Creator {
    protected $createdProduct;
    abstract public function factoryMethod(Product $productNow);
}

这是Product.php

interface Product {
    function provideShape();
}

这是Rectangle.php

include_once('Product.php');

class Rectangle implements Product {
    private $x;
    private $y;
            //Here is I am setting users provided x and y values with private vars
    public function __construct($x, $y) {
        echo $x;
        $this->x = $x;
        $this->y = $y;
    }

    public function provideShape() {
        echo $this->x; //Here x does not show up
        return 'Rectangle (' . $this->x . ', ' . $this->y . ')';
                    //above x and y does not show up.
    }
}

1 个答案:

答案 0 :(得分:0)

使用工厂的例子让你了解如何做到这一点

class Shape{
    int x,y
}

class Rectangle implements Shape{

}

class Circle implements Shape{

}
class ShapeCreator{
    public function create(string shapeName, int x, int y) {
        switch(shapeName)
            rectangle:
                return new Rectangle(x,y)
            circle:
                return new Circle(x,y)
    }    
}
main{
    sc = new ShapeCreator
    Shape circle = sc.create(1,2, "circle")
}

要查看其他概念,请参阅wikipedia,有时Factory类只是一个接口,而不是由不同类型的具体工厂实现,但如果代码很简单,您可以使用大小写实现创建对象。