设计模式抽象工厂模式结合类图秒懂

好用的小火箭节点推荐⭐Shadowrocket高速节点推荐

定义

抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式,是工厂方法模式的升级版,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。

抽象工厂模式包含了几个角色:

AbstractFactory:用于声明生成抽象产品的方法

ConcreteFactory:实现了抽象工厂声明的生成抽象产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品都位于某个产品等级结构中;

AbstractProduct:为每种产品声明接口,在抽象产品中定义了产品的抽象业务方法;

Product:定义具体工厂生产的具体产品对象,实现抽象产品接口中定义的业务方法。

这是它的通用类图:

其中 AbstractProductA 和 AbstractProductB 就是两个产品族的抽象类 (或者接口),而 Product1 和 Product2 就是产品族下的具体产品类,AbstractCreator 就是工厂的抽象。

我们可以用操作系统来举例,现在市面上用的最多的两种PC端操作系统是windows和Linux,两个系统都有共同类型的组件,如文件夹,按钮,文本等。套用下抽象工厂的通用类图,我们不难发现,两个系统就相当于产品组抽象类AbstractProductA 和 AbstractProductB,而按钮、文本这些组件就是具体的产品类。

然后再来分析一下,如果有一个应用要在两个系统上运行,应该怎么设计?是编写两套程序运行于不同的系统上?这样实在是太浪费资源了,我们可以通过抽象工厂模式屏蔽掉操作系统对应用的影响。软件功能、逻辑、UI 都一个非常类似,唯一的不同是调用不同的工厂方法,由不同的产品类去处理与操作系统交互的信息,而这就是抽象工厂的优势。

代码编写

抽象工厂的通用类图我们已经了解了,下面就是具体代码的实现:

产品族的抽象类,AbstractProductA 和 AbstractProductB,

public abstract class AbstractProductA {    //每个产品共有的方法    public void shareMethod() {    }    // 每个产品相同方法,不同实现    public abstract void doSomething();}public abstract class AbstractProductB {    //每个产品共有的方法    public void shareMethod() {    }    // 每个产品相同方法,不同实现    public abstract void doSomething();}

两个产品族的具体实现类代码,

public class ProductA1 extends AbstractProductA {    public void doSomething() {        System.out.println("我是产品A1");    }}public class ProductA2 extends AbstractProductA {    public void doSomething() {        System.out.println("我是产品A2");    }}public class ProductB1 extends AbstractProductB {    public void doSomething() {        System.out.println("我是产品B1");    }}public class ProductB2 extends AbstractProductB {    public void doSomething() {        System.out.println("我是产品B2");    }}

抽象工厂类AbstractCreator,有N个产品族,在抽象工厂类中就应该有N个创建方法。我们这里定义两个产品族的产品创建,代码如下:

public abstract class AbstractCreator {    //创建A产品    public abstract AbstractProductA createProductA();    //创建B产品    public abstract AbstractProductB createProductB();}

然后是创建产品的具体工厂,有N个产品等级就应该有N个实现工厂类,在每个实现工厂中,实现不同产品族的生产任务。

public class Creator1 extends AbstractCreator {    public AbstractProductA createProductA() {        return new ProductA1();    }    public AbstractProductB createProductB() {        return new ProductB1();    }}public class Creator2 extends AbstractCreator {    public AbstractProductA createProductA() {        return new ProductA2();    }    public AbstractProductB createProductB() {        return new ProductB2();    }}

到此为止,我们把所有的角色都创建出来了,最后设计一个场景类,验证下是否能输出对应产品的信息,

public class Client {    public static void main(String[] args) {        //定义出两个工厂        AbstractCreator creator1 = new Creator1();        AbstractCreator creator2 = new Creator2();        //产生A1对象        AbstractProductA a1 = creator1.createProductA();        //产生A2对象        AbstractProductA a2 = creator2.createProductA();        //产生B1对象        AbstractProductB b1 = creator1.createProductB();        //产生B2对象        AbstractProductB b2 = creator2.createProductB();        a1.doSomething();        a2.doSomething();        b1.doSomething();        b2.doSomething();    }}

运行的结果为:

我是产品A1我是产品A2我是产品B1我是产品B2

总结

版权声明:
作者:shadowrocket
链接:https://www.shadowrockets.wang/814.html
来源:Shadowrocket官网
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
< <上一篇
下一篇>>