手机版

PHP实现设计模式中抽象工厂的详细说明

时间:2021-09-09 来源:互联网 编辑:宝哥软件园 浏览:

抽象工厂是一种常见的软件设计模式。这种模式为创建产品系列提供了统一的界面。当需要该产品系列的一个系列时,可以为该系列产品系列创建一个特定的工厂类。

[意图]

抽象工厂提供了一个接口来创建一个系统相关或相互依赖的对象,而不需要指定它们的特定类[GOF95]

[抽象工厂结构图]

[抽象工厂中的主要角色]

抽象工厂角色:它声明了一个用于创建抽象产品对象的接口。它通常实现为一个接口或抽象类,所有具体的工厂类都必须实现这个接口或继承这个类。

混凝土工厂的作用:实现创建产品对象的操作。客户端直接调用该角色来创建产品的实例。该角色包含选择适当产品对象的逻辑。通常使用具体的类来实现。

抽象产品角色:声明一类产品的接口。它是由工厂方法模式创建的对象的父类,或者它们共享的接口。

具体产品角色:实现抽象产品角色定义的接口,定义对应具体工厂要创建的产品对象。它包含应用程序的业务逻辑。

【抽象工厂的优缺点】

抽象工厂优势:1。单独的特定类别2。便于添加或更换产品系列3。有利于产品一致性

抽象工厂的缺点:难以支持新的产品种类。这是因为抽象工厂接口决定了可以创建的产品集合。为了支持新类型的产品,需要扩展工厂接口,这导致了抽象工厂类及其所有子类的变化。抽象工厂支持以倾斜的方式添加新产品,为添加新产品系列提供了便利,但不支持添加新产品层级。

[抽象工厂适用场景]

抽象工厂应在以下情况下使用:1。一个系统不应该依赖于如何创建、组合和表达产品实例的细节,这对于所有形式的工厂模型都很重要。2.该系统的产品有多个产品系列,系统只消费一个系列的产品。3.属于同一产品系列的产品一起使用,这种约束必须在系统设计中体现出来。4.系统提供了一个产品类库,所有产品都以相同的界面出现,所以客户端独立于实现Java和Pattern第189页]

抽象工厂模式的几个要点:

1.如果不改变“多系列对象构造”的要求,就没有必要使用抽象工厂模式。2.“系列对象”是指这些对象之间的相互依赖或功能关系。3.抽象工厂模式主要是为了应对“新系列”需求的变化。缺点是难以应对“新对象”的需求变化。需要注意的是,如前所述,如果我们现在想添加其他系列的类,代码会有很大的变化。4.抽象工厂模式通常与工厂方法模式相结合,以应对“对象创建”需求的变化。

抽象工厂中的添加

1.添加新的产品系列意味着在每个产品层次结构中添加一个(或多个)新的具体(或抽象和具体)产品角色,而不改变产品层次结构的数量。由于工厂等级结构是与产品等级结构平行的注册机构,在产品等级结构调整时,需要对工厂等级结构进行相应的调整。现在产品层次结构中有了新元素,需要在工厂层次结构中增加相应的新元素。换句话说,设计人员只需要向系统中添加新的特定工厂类,不需要修改现有的工厂角色或产品角色。因此,当系统中的产品族增加时,抽象工厂支持“开闭”原则。

2.在产品族数量不变的情况下,增加新的产品等级结构。换句话说,所有产品等级结构中的产品数量不会改变,但现在有了与现有产品等级结构平行的新的产品等级结构。要实现这一点,需要修改所有工厂角色,并在每个工厂类中添加一个新的工厂方法,这显然违反了“开-关”原则。换句话说,抽象工厂不支持产品等级结构增加的“开闭”原则。

综上所述,我们可以知道,将其具体产品添加到现有的抽象产品中支持“开闭原则”,但在添加其抽象产品时,不支持“开闭”原则。抽象工厂以倾斜的方式支持新产品的添加,为新产品家族的添加提供了便利,但不为新产品等级结构的添加提供便利。

[抽象工厂和其他模式]

单例模式(Singleton mode):一个特定的工厂类可以被设计成单例类。因为通常只有一个工厂,所以一个特定的工厂子类通常被实现为单例。

工厂方法模式:抽象工厂创造产品的方法定义为工厂方法。

原型模式:如果有多个可能的产品族,具体工厂也可以使用原型模式,具体工厂使用产品族。

每个产品的原型都被实例化,并通过复制其原型来创建新产品。

[抽象工厂PHP示例]

复制代码代码如下:Php/***抽象工厂2010-05-28 SZ * @作者phppan . p # gmail.com * @包设计模式*//* * *抽象工厂*/接口抽象工厂{/* * * *创建等级结构a *产品的工厂方法/公共函数createProductA();/* * *用等级结构b *创建产品的工厂方法/公共函数createProductB();}/* * *混凝土工厂1 */class混凝土工厂1实现抽象工厂{ public function create producta(){ return new producta 1();}公共函数createProductB(){ return new ProductB1();}}/* * *混凝土工厂2 */class混凝土工厂2实现抽象工厂{公共函数create producta(){ return new producta 2();}公共函数createProductB(){ return new ProductB2();}}/* * *抽象产品a */接口抽象产品a {/* * *获取产品名称*/公共函数GetName();}/* * *抽象产品b */接口abstractproductb {/* * *获取产品名称*/公共函数getName();}/* * *具体产品a1 */class producta1实现抽象产品{ private $ _ namepublic function _ _ construct(){ $ this-_ name=' product A1 ';} public function getName(){ return $ this-_ name;}}/* * *具体产品a2 */类产品a2实现抽象产品{ private $ _ namepublic function _ _ construct(){ $ this-_ name=' product A2 ';} public function getName(){ return $ this-_ name;}}/* * *具体产品B1 */classproductb1实现abstract productb { private $ _ name;public function _ _ construct(){ $ this-_ name=' product B1 ';} public function getName(){ return $ this-_ name;}}/* * *混凝土产品B2 */classproductb2实现abstract productb { private $ _ name;public function _ _ construct(){ $ this-_ name=' product B2 ';} public function getName(){ return $ this-_ name;}}/* * *客户端*/classclient {/* * *主程序。*/public static function main(){ self :3360 run(新混凝土厂1());self:run(新混凝土工厂2());}/* * *调用工厂实例生成产品,并输出产品名称* @param $factory AbstractFactory实例*/public static函数run(abstract factory $ factory){ $ producta=$ factory-createproducta();$ ProducB=$ factory-CreateProducB();echo $ ProducA-GetName(),' br/';echo $productB-getName(),' br/';} } client :3360 main();

版权声明:PHP实现设计模式中抽象工厂的详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。