2015-09-07 75 views
0

我实现了Factory Method模式,但是检查了几个例子,我无法确定扩展产品的具体类而不是创建抽象类或接口是否正确......仅仅用于示例(PHP)。非抽象产品的方法工厂

所以,我有我的抽象工厂和他们的具体工厂:

interface BookFactoryInterface 
{ 
    public function createBook(); 
} 

class ElectronicBookFactory implements BookFactoryInterface 
{ 
    public function createBook() 
    { 
     return new ElectronicBook(); 
    } 
} 

class PaperBookFactory implements BookFactoryInterface 
{ 
    public function createBook() 
    { 
     return new PaperBook(); 
    } 
} 

现在我已经看到了所有的例子是通常的产品从抽象类或接口扩展,但是当我测试我意识到在我的情况下并不需要那个,我需要的是一个具有共同行为的具体类,然后是我的其余子类。

class Book 
{ 
    /* 
     All properties like title, authors, publicationDate 
     here, with the corresponding methods. 
    */ 
} 

class ElectronicBook extends Book 
{ 
    //... 
} 

class PaperBook extends Book 
{ 
    //... 
} 

的类的实例仍然被导出到子类,所以我真的相信这是一个工厂方法实现,但我能找到这样的另一个示例代码。

所以问题是:这仍然是一个工厂方法的实现?如果不是为什么?

回答

0

这是非常主观的,但我会争辩说,你不需要任何继承,因为它是一个工厂方法。这实际上足以满足定义:

class Book { 

} 

class BookFactory { 

    function createBook() { 

    return new Book();  

    } 

} 
1

需要为抽象(使用接口或抽象类)来的时候,你需要改变的代码创建的具体对象。当情况出现时,这尤其有用,例如在编写单元测试时,或者您需要添加更少的产品(或/和)创建者。

有趣的是知道工厂和工厂的方法有所不同。工厂是将创造部分封装到具有照顾创造部分的方法的类中的方式。另一方面,工厂方法被赋予“创造者”创造“产品”,可以由创作者决定。创建产品的方法,比如说createProduct(),通常在Creator中(通过继承来引发),其他方法的意图通常是由Factory Method创建的产品。

现在,在创作者和产品中,我们使用了一种并行的层次结构,以便创作者不依赖(或知道产品是如何创建的)混凝土产品,产品也不知道创作者。这有助于实现松散耦合的代码(这里,CHANGE不会互相影响)。

希望这会有所帮助。

你可以读到更多在: