|
一、什么是抽象工厂模式
抽象工厂模式是一种软件设计模式,它提供了一种方法来创建一组相关或相互依赖的对象,而无需指定它们具体的类。
抽象工厂模式是一种创建型设计模式,它通过提供一个接口来创建一些相关或依赖的对象,而无需指定他们的具体类。这样,当需要更换具体的产品族时,只需要更换相应的工厂实现即可。
抽象工厂模式包含以下角色:
- AbstractFactory:抽象工厂
- ConcreteFactory:具体工厂
- AbstractProduct:抽象产品
- ConcreteProduct:具体产品
- Client:客户端
在抽象工厂模式中,客户端不需要知道所创建的具体产品的类名,只需要知道具体工厂和抽象产品的名称即可。当需要更换产品族时,只需要更换具体工厂即可。
二、抽象工厂模式案例
假设有一个电子产品制造商,生产手机和电脑。这个公司有两个工厂,分别生产苹果品牌的产品和三星品牌的产品。
首先,我们定义抽象工厂 AbstractFactory 和抽象产品 AbstractProduct:
// 抽象工厂
abstract class AbstractFactory {
abstract AbstractPhone createPhone();
abstract AbstractComputer createComputer();
}
// 抽象产品
abstract class AbstractPhone {
abstract void call();
}
abstract class AbstractComputer {
abstract void work();
}然后,我们定义两个具体工厂 AppleFactory 和 SamsungFactory,以及两个具体产品 ApplePhone 和 SamsungPhone、AppleComputer 和 SamsungComputer:
// 具体工厂
class AppleFactory extends AbstractFactory {
AbstractPhone createPhone() {
return new ApplePhone();
}
AbstractComputer createComputer() {
return new AppleComputer();
}
}
class SamsungFactory extends AbstractFactory {
AbstractPhone createPhone() {
return new SamsungPhone();
}
AbstractComputer createComputer() {
return new SamsungComputer();
}
}
// 具体产品
class ApplePhone extends AbstractPhone {
void call() {
System.out.println("使用苹果手机打电话");
}
}
class SamsungPhone extends AbstractPhone {
void call() {
System.out.println("使用三星手机打电话");
}
}
class AppleComputer extends AbstractComputer {
void work() {
System.out.println("使用苹果电脑工作");
}
}
class SamsungComputer extends AbstractComputer {
void work() {
System.out.println("使用三星电脑工作");
}
}最后,我们可以定义客户端 Client,使用抽象工厂和抽象产品:
class Client {
AbstractFactory factory;
Client(AbstractFactory factory) {
this.factory = factory;
}
void buyPhone() {
AbstractPhone phone = factory.createPhone();
phone.call();
}
void buyComputer() {
AbstractComputer computer = factory.createComputer();
computer.work();
}
}我们可以使用 Client 类来购买苹果品牌的手机和电脑:
Client client = new Client(new AppleFactory());
client.buyPhone(); // 使用苹果手机打电话
client.buyComputer(); // 使用苹果电脑工作也可以购买三星品牌的手机和电脑:
Client client = new Client(new SamsungFactory());
client.buyPhone(); // 使用三星手机打电话
client.buyComputer(); // 使用三星电脑工作当需要更换产品族时,只需要更换具体工厂的实现即可。
三、优点和缺点
优点:
- 使用抽象工厂模式可以很方便地切换产品族,即可以很容易地更换一组具体产品的实现。
- 抽象工厂模式隔离了具体产品的实现,使得客户端不需要关心产品的具体实现。
- 抽象工厂模式可以支持产品族的扩展。
缺点:
- 抽象工厂模式中的抽象工厂和抽象产品是比较抽象的概念,不太容易理解。
- 当需要更换产品族时,必须更改抽象工厂的子类,这可能需要修改源代码,并可能导致代码不兼容。
四、使用场景
- 一个系统不应当依赖于产品类实例如何被创建、组合和表达的细节,这对于所有类型的工厂模式都是很重要的。
- 系统中有多于一个的产品族,而每次只使用其中某一产品族。
- 属于同一个产品族的产品将在一起使用,这一约束必须在系统的设计中体现出来。
- 系统提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
总之,抽象工厂模式适用于需要多个产品族的场景,并且每次只使用其中的一个产品族。
四、在java中哪些地方用到了抽象工厂
Java 语言自带的包管理器 Maven 内置了一个名为 javax.xml.parsers 的库,该库使用了抽象工厂模式来支持多种不同的 XML 解析器。
下面是使用该库解析 XML 文档的示例代码:
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;
import java.io.IOException;
public class XmlParserExample {
public static void main(String[] args) {
// 创建文档构建器工厂
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 创建文档构建器
try {
DocumentBuilder builder = factory.newDocumentBuilder();
// 解析 XML 文档
Document document = builder.parse("document.xml");
// 输出解析结果
System.out.println(document);
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
}
}
}在这个示例中,DocumentBuilderFactory 类是一个抽象工厂。
创作不易,动下你发财小手帮忙点个赞呗。爱你哦,么么哒!!
23种设计模式直达地址:
第1种-单例模式(创建型模式)
第2种-抽象工厂模式(创建型模式)
第3种-抽象方法工厂模式(创建型)
第4种-建造者模式(创建型模式)
第5种-原型模式(创建型模式)
第6种-适配器模式(结构型模式)
第7种-桥接模式(结构型模式)
第8种-装饰模式(结构型模式)
第9种-组合模式(结构型模式)
第10种-外观模式(结构型模式)
第11种-享元模式(结构型模式)
第12种-代理模式(结构型模式)
第13种-观察者模式(行为型模式)
第14种-模板方法模式(行为型模式)
第15种-命令模式(行为型模式)
第16种-迭代器模式(行为型模式)
第17种-责任链模式(行为型模式)
第18种-策略模式(行为型模式)
第19种-状态模式(行为型模式)
第20种-访问者模式(行为型模式)
第21种-中介者模式(行为型模式)
第22种-备忘录模式(行为型模式)
第23种-解释器模式(行为型模式)
持续更新中...... |
|