抽象工厂模式

来源:互联网 发布:软件项目标书 编辑:程序博客网 时间:2024/06/05 18:12

定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。

AbstractFactory:抽象工厂,定义创建一系列产品对象的接口
ConcreteFactory:具体工厂,实现抽象工厂定义的方法,具体实现一系列产品对象的创建
AbstractProduct:定义一类产品对象的接口
ConcreteProduct:具体的产品实现对象,通常在具体工厂里面,会选择具体的产品实现对象,来创建符合抽象工厂定义的方法返回的产品类型的对象
Client:客户端,主要使用抽象工厂来获取一系列所需要的产品对象,然后面向这些产品对象的接口编程,以实现需要的功能

/***抽象产品A的接口*/public interface AbstractProductA {    //定义抽象产品A相关的操作    public void A();}public class ProductA1 implements AbstractProductA {    public void A() {        System.out.println("ProductA1");    }}public class ProductA2 implements AbstractProductA {    public void A() {        System.out.println("ProductA2");    }}/***抽象产品B的接口*/public interface AbstractProductB {    //定义抽象产品B相关的操作    public void B();}public class ProductB1 implements AbstractProductB {    public void B() {        System.out.println("ProductB1");    }}public class ProductB2 implements AbstractProductB {    public void B() {        System.out.println("ProductB2");    }}/***抽象工厂的接口,声明创建抽象产品对象的操作*/public interface AbstractFactory {    //创建抽象产品A的对象    public AbstractProductA createProductA();    //创建抽象产品B的对象    public AbstractProductB createProductB();}/***具体的工厂实现对象,实现创建具体的产品对象的操作,而这些具体产品属于一个系列的,都*是“1”系列*/public class ConcereFactory1 implements AbstractFactory {    public AbstractProductA createProductA() {        return new ProductA1();    }    public AbstractProductB createProductB() {        return new ProductB1();    }}/***具体的工厂实现对象,实现创建具体的产品对象的操作,而这些具体产品属于一个系列的,都*是“2”系列*/public class ConcereFactory2 implements AbstractFactory {    public AbstractProductA createProductA() {        return new ProductA2();    }    public AbstractProductB createProductB() {        return new ProductB2();    }}

体会抽象工厂模式
举个生活中常见的例子–组装电脑

认识抽象工厂模式
1. 模式的功能
抽象工厂的功能是为一系列相关对象或相互依赖的对象创建一个接口。从某种意义上看,抽象工厂其实是一个产品系列,或者产品族。
2. 实现成接口
AbstractFactory在Java中通常实现成为接口,大家不要被名称误导了,以为实现成为抽象类
3. 使用工厂方法
AbstractFactory定义了创建产品所需要的接口,具体的实现是在实现类里面,通常在实现类里面就需要选择多种更具体的实现,所以AbstractFactory定义的创建产品的方法可以看成是工厂方法,而这些工厂方法的具体实现就延迟到了具体的工厂里面。也就是说使用工厂方法来实现抽象工厂。
4. 切换产品族
抽象工厂定义了一个产品族,因此切换产品族的时候提供不同的抽象工厂就好了

定义可扩展的工厂
在前面的示例中,抽象工厂为每一种它能创建的产品对象都定义了相应的方法,比如创建CPU的方法和创建主板的方法等。
这种实现有一个麻烦,就是如果在产品族中要新增加一种产品,比如现在要求抽象工厂除了能够创建CPU和主板外,还要能够创建内存对象,那么就需要在抽象工厂里面添加创建内存的这么一个方法。当抽象工厂一发生变化,所有的具体工厂实现都要发生变化,这非常的不灵活。