大话设计模式之抽象工厂模式

举报
SHQ5785 发表于 2023/07/21 08:42:44 2023/07/21
【摘要】 一、前言今天主要讲解抽象工厂模式。抽象工厂模式(Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻译,“为创建一组...

一、前言

今天主要讲解抽象工厂模式。抽象工厂模式Abstract Factory Pattern)是工厂方法模式的进一步抽象,其英文原话"Provide an interface for creating families of related or dependent objects without specifying their concrete classes",翻译,“为创建一组相关或相互依赖的对象提供一个接口,无需指定它们的具体类”。

抽象工厂模式通常是用于创建一族产品,并且这族产品分不同的等级;不同的具体工厂类生产不同等级的一族产品。抽象工厂模式也有四种角色:抽象工厂、具体工厂、抽象产品和具体产品,具体解释参见博文《大话设计模式(六)工厂方法模式》。

抽象工厂模式的类图如下:
这里写图片描述
可以看到产品族包括ProductA和ProductB两种产品,每个具体工厂都能生产这两种产品,只是ConcreteFactory1生产的等级为1的族产品;ConcreteFactory2生产的是等级为2的族产品。下面以上图为模型,写一个demo,测试抽象工厂模式。

二、码上有戏

package cn.edu.ujn.designpattern;

//抽象产品A,定义了产品的公共方法,产品A和B属于一个产品族  
interface ProductA {
	public void method1();

	public void method2();
}

// 抽象产品B,定义了产品的公共方法,产品A和B属于一个产品族
interface ProductB {
	public void method1();

	public void method2();
}

// 等级为1的具体产品A
class ConcreateProductA1 implements ProductA {

	@Override
	public void method1() {
		System.out.println("等级为1的产品A的method1()");
	}

	@Override
	public void method2() {
		System.out.println("等级为1的产品A的method2()");
	}
}

// 等级为2的具体产品A
class ConcreateProductA2 implements ProductA {

	@Override
	public void method1() {
		System.out.println("等级为2的产品A的method1()");
	}

	@Override
	public void method2() {
		System.out.println("等级为2的产品A的method2()");
	}
}

// 等级为1的具体产品B
class ConcreateProductB1 implements ProductB {

	@Override
	public void method1() {
		System.out.println("等级为1的产品B的method1()");
	}

	@Override
	public void method2() {
		System.out.println("等级为1的产品B的method2()");
	}
}

// 等级为2的具体产品B
class ConcreateProductB2 implements ProductB {

	@Override
	public void method1() {
		System.out.println("等级为2的产品B的method1()");
	}

	@Override
	public void method2() {
		System.out.println("等级为2的产品B的method2()");
	}
}

//抽象工厂,定义了生产族产品的方法;  
interface AbstractFactory_ {  
	public ProductA factoryA();  
	public ProductB factoryB();  
}

// 具体工厂(生产等级为1的族产品)
class ConcreateFactory1 implements AbstractFactory_ {

	// 生产等级为1的产品A
	@Override
	public ProductA factoryA() {
		return new ConcreateProductA1();
	}

	// 生产等级为1的产品B
	@Override
	public ProductB factoryB() {
		return new ConcreateProductB1();
	}
} 

//具体工厂(生产等级为2的族产品)
class ConcreateFactory2 implements AbstractFactory_ {

	// 生产等级为2的产品A
	@Override
	public ProductA factoryA() {
		return new ConcreateProductA2();
	}

	// 生产等级为2的产品B
	@Override
	public ProductB factoryB() {
		return new ConcreateProductB2();
	}
} 

public class AbstractFactory {
	public static void main(String[] args) {
		AbstractFactory_ absFac = new ConcreateFactory1();
		ProductA productA = absFac.factoryA();
		productA.method1();
	}
}

三、优缺点

3.1 抽象工厂模式的优点

  1. 易于交换产品系列,由于具体工厂类,在一个应用程序中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需改变具体工厂即可使用不同的产品配置。
  2. 它让具体的创建实例过程与客户端分离,客户端是通过他们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。

3.2 抽象工厂模式的缺点

  1. 抽象模式虽然便于两数据库之间的切换,但是不便于增加需求功能。
  2. 如果有100个调用数据库访问的类,就需要多次实例化100此具体工厂类。

四、抽象工厂模式、反射以及配置文件

反射方法的实质是在对象实例化的时候传引用,将程序由编译时转为运行时,通过字符串变量来处理,去除了if、switch判断的麻烦。但是如果数据库在更换时,还需要去修改程序(字符串的值)重编译。

通过添加配置文件可以解决更改DataAccess的问题。

五、总结

  • 抽象工厂模式相对于工厂方法模式来说,每个具体工厂可以生产一族产品(即多种产品);而工厂方法模式是具体工厂生产相应的具体产品,只能生产一种产品。当产品族中只有一种产品时抽象工厂模式退化成工厂方法模式。
  • 抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。
  • 无论是简单工厂模式,工厂方法模式,还是抽象工厂模式,他们都属于工厂模式,在形式和特点上也是极为相似的,他们的最终目的都是为了解耦。在使用时,我们不必去在意这个模式到底工厂方法模式还是抽象工厂模式,因为他们之间的演变常常是令人琢磨不透的。经常你会发现,明明使用的工厂方法模式,当新需求来临,稍加修改,加入了一个新方法后,由于类中的产品构成了不同等级结构中的产品族,它就变成抽象工厂模式了;而对于抽象工厂模式,当减少一个方法使的提供的产品不再构成产品族之后,它就演变成了工厂方法模式。所以,在使用工厂模式时,只需要关心降低耦合度的目的是否达到了。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。