`

富足的抽象工厂模式(Abstract Factory Pattern)

阅读更多

如果把工厂方法模式看作是小厂的作风,那抽象工厂模式绝对是土豪,因为它具有多个业务品种,工厂富足了!

 

抽象工厂模式的官方定义为:为创建一组相关或相互依赖的对象提供一个接口,而且无需指定它们的具体类。

 

抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

在工厂模式的例子中,可以出产出超级用户和普通用户,如果现在在此基础上区分性别,该如何?

如图所示,同样定义一个公共接口User,再定义两个子抽象类abstractSuperUser和abstractCommonUser,分别对应为超级用户和普通用户抽象类,再分别定义其子类以区分性别。

同时定义一个公共接口UserFactory,内置createSuperUser和createCommonUser分别生产超级用户和普通用户,再分别定义其子类以区分性别。实现代码如下:

<?php
interface userFactory {
	public function createSuperUser();
	public function createCommonUser();
}

class maleUserFactory implements userFactory{
	public function createSuperUser() {
		return new superMaleUser();
	}

	public function createCommonUser(){
		return new commonMaleUser();
	}
}

class femaleUserFactory implements userFactory{
	public function createSuperUser() {
		return new superFemaleUser();
	}

	public function createCommonUser(){
		return new commonFemaleUser();
	}
}



interface User{
	public function getGrade();
}

abstract class abstractSuperUser implements User{
	public function getGrade() {
		echo '超级用户';
	}
}

abstract class abstractCommoUser implements User{
	public function getGrade() {
		echo '普通用户';
	}
}

class superMaleUser extends abstractSuperUser{
	public function getSex(){
		echo "超级男性用户\n";
	}
}

class superFemaleUser extends abstractSuperUser{
	public function getSex(){
		echo "超级女性用户\n";
	}
}

class commonMaleUser extends abstractCommoUser{
	public function getSex(){
		echo "普通男性用户\n";
	}
}

class commonFemaleUser extends abstractCommoUser{
	public function getSex(){
		echo "普通女性用户\n";
	}
}

$maleUserFactory = new maleUserFactory();
$maleUserFactory->createSuperUser()->getSex();
$maleUserFactory->createCommonUser()->getSex();

$femaleUserFactory = new femaleUserFactory();
$femaleUserFactory->createSuperUser()->getSex();
$femaleUserFactory->createCommonUser()->getSex();

?>
运行结果:
超级男性用户
普通男性用户
超级女性用户
普通女性用户
[Finished in 0.1s]

 
 抽象工厂模式的优点:

1、封装性,每个产品的实现类不是高层模块要关心的,它要关心的是接口,是抽象。它不关心对象是如何创建出来。只要知道工厂类是谁,就能创建出一个需要的对象,省时省力。

2、产品族内的决定为非公开状态。生产过程对调用工厂类的高层模块来说是透明的,它不需要知道这个约束,具体的产品族内的约束是在工厂内实现的。

 

抽象工厂模式的缺点:

抽象工厂模式的最大缺点就是产品族扩展非常困难。以上面例子为例,如果现在要增加一个介于超级与普通用户之间的特殊用户,看看程序有多大的改动吧,userFactory接口新增一个createSpecialUser方法用于创建特殊用户,其下面所有子类都要同样修改,这严重违反了开闭原则,而且我们一直说明抽象类和接口是一个契约。改变契约,所有与契约有关系的代码都要修改,那么这段代码叫什么?叫“有毒代码”——只要与这段代码有关系,就可能产生侵害的风险!

 

抽象工厂模式的使用场景:

抽象工厂模式的使用场景定义,一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。例如一个文本编辑器和一个图片处理器,都是软件实体,但是linux下的文体编辑器和 windows下的文体编辑器虽然功能和界面都相同,但是代码实现是不同的,图片处理器也是类似情况。也就是具有了共同的约束条件,操作系统类型。于是就可以使用抽象工厂模式,产生不同操作系统下的编辑器和图片处理器。

 

抽象工厂模式的注意事项:

在上面提到的缺点中,说到抽象工厂模式的产品族扩展比较困难,但是一定要清楚,是产品族扩展困难,而不是产品等级。在该模式下,产品等级是非常容易扩展的,增加一个产品等级,只要增加一个工厂类负责新增出来的产品任务即可。也就是横向扩展容易,纵向扩展困难。以上面User的例子,产品等级中只有男、女两个性别,现实世界还有一种性别:双性人,那要扩展这个产品等级也是非常容易的,增加两个产品类,分别对应不同的等级,然后再创建一个工厂类,专门负责不同等级人的双性人的创建任务,完全通过扩展来实现需求的变更,从这一点上看,抽象工厂模式是符合开闭原则的。

 

3
5
分享到:
评论

相关推荐

    创建型模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):这是模式的核心,它是一个接口或抽象类,定义了一系列创建对象的方法,但并不直接实例化具体的对象。这些方法用于创建一系列相关或相互依赖的对象。 2. 具体工厂(Concrete ...

    通过python实现抽象工厂模式(Abstract Factory Pattern).rar

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种在不指定具体类的情况下创建一系列相关或相互依赖对象的接口。这个模式使得客户端代码与具体产品的实现解耦,从而提高了系统的灵活性和...

    通过C#实现抽象工厂模式(Abstract Factory Pattern).rar

    在C#中实现抽象工厂模式(Abstract Factory Pattern)涉及定义一个抽象工厂接口,该接口声明用于创建抽象产品的方法。然后,为每个具体产品族实现一个具体工厂,这些工厂提供创建具体产品的实现。最后,客户端代码...

    抽象工厂模式(Abstract Factory Pattern)

    ### 抽象工厂模式(Abstract Factory Pattern) #### 引入 在探讨抽象工厂模式之前,我们先回顾一下之前介绍过的简单工厂模式与工厂方法模式。这两种模式主要关注于解决对象创建过程中“new”操作的问题,使得创建...

    抽象工厂模式abstractFactory

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种创建对象集合的接口,而无需指定具体的产品类型。这种模式适用于当系统需要在不同平台或环境中创建一组相关或相互依赖的对象时,而这些...

    设计模式 之 “抽象工厂模式[Abstract Factory Pattern]”

    **抽象工厂模式(Abstract Factory Pattern)**是一种创建型设计模式,它提供了一种创建对象族的接口,而无需指定它们的具体类。这种模式是当一个系统需要根据不同的平台或者环境来创建一组相关或相互依赖的对象时,...

    通过java实现抽象工厂模式(Abstract Factory Pattern).rar

    在Java中,抽象工厂模式(Abstract Factory Pattern)同样是一种创建型设计模式,它允许在不指定具体类的情况下创建一系列相关或相互依赖的对象。压缩包文件代码是一个简单的Java实现示例,展示了如何使用抽象工厂...

    [创建型模式] 设计模式之抽象工厂模式(Abstract Factory Pattern)

    1. 抽象工厂(Abstract Factory):定义一个创建对象的接口,但不指定具体的产品实现,而是由具体的工厂类来实现。 2. 具体工厂(Concrete Factory):实现了抽象工厂接口,负责创建具体的产品对象。 3. 抽象产品...

    创建型-抽象工厂模式(Abstract Factory)

    此外,抽象工厂模式还可以与其他设计模式结合使用,比如工厂方法模式(Factory Method Pattern),在某些情况下,可以将抽象工厂模式的抽象工厂类设计为工厂方法模式,让子类决定实例化哪一个类。同时,抽象工厂模式...

    C#设计模式之抽象工厂(abstract factory)模式示例源代码

    抽象工厂模式(Abstract Factory Pattern)是创建型设计模式的一种,它提供了一个接口用于创建一系列相关的或相互依赖的对象,而无需指定它们具体的类。该模式的核心在于提供一个高层接口来创建一组相关的产品对象。...

    Abstract Factory Pattern.docx

    `AbstractFactory`是抽象工厂,定义了创建`AbstractProductA`和`AbstractProductB`的接口;`ConcreteFactory1`和`ConcreteFactory2`是具体工厂,分别创建`ProductA1`和`ProductB1`,以及`ProductA2`和`ProductB2`。`...

    设计模式之抽象工厂模式-c++

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,提供一个接口用于创建一系列相关或相互依赖的对象,而无需指定它们的具体类。这种模式常用于需要跨多个产品系列进行实例化的场景。 抽象工厂模式的...

    李建忠 C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式)

    **抽象工厂模式(Abstract Factory Pattern)是创建型设计模式之一,它提供了一种创建对象的接口,使得子类可以决定实例化哪一个类。这种类型的设计模式属于类的创建模式。** 在C#中,抽象工厂模式的核心在于抽象...

    Head First 设计模式 (四) 工厂模式(factory pattern) C++实现

    1. **抽象工厂(Abstract Factory)**:这是工厂模式的核心接口,定义了创建产品对象的公共接口。在C++中,通常用抽象类或者纯虚函数接口来表示。 2. **具体工厂(Concrete Factory)**:实现了抽象工厂接口,负责...

    工厂方法模式和抽象工厂模式

    在软件设计模式中,工厂方法模式(Factory Method Pattern)和抽象工厂模式(Abstract Factory Pattern)是两种常用的创建型设计模式,它们都属于“工厂”家族,但有着不同的应用场景和目标。 工厂方法模式的核心...

    Java24种设计模式,Java24种设计模式,24种设计模式,学会了这24种设计模式,可以打遍天下无敌手,设计模式非常重要

    6、抽象工厂模式ABSTRACT FACTORY PATTERN 7、门面模式FACADE PATTERN 8、适配器模式ADAPTER PATTERN 9、模板方法模式TEMPLATE METHOD PATTERN 10、建造者模式BUILDER PATTERN 11、桥梁模式BRIDGE PATTERN 12、...

    单例模式,工厂模式,抽象工厂模式,建造者模式VS2019 C++代码实现

    主要实现了4种设计创建型模式的示例,分别是单例模模式(Singleton Pattern),工厂模式(Factory pattern),抽象工厂模式(Abstract Factory pattern),建造者模式(Builder Pattern) 使用人群:希望对这四种模式有所...

    java常用设计模式-抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它通过定义一个创建对象的接口来创建对象,但将具体实现的决定留给子类来决定。在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式...

    C# 工厂模式开发示例,详细展示三种工厂模式

    3、抽象工厂模式(Abstract Factory Pattern): 抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,而无需明确指定具体类。通过使用抽象工厂模式,一个类可以实例化一组相关对象,而不需要知道它们的具体类...

Global site tag (gtag.js) - Google Analytics