抽象工厂模式

前一篇文章写了简单工厂模式和工厂方法模式:

https://blog.csdn.net/bluerheaven/article/details/106226936

 

又是一个工厂模式:抽象工厂模式。23种设计模式中有3个工厂模式,傻傻分不清楚

抽象工厂模式的定义:

为创建一组相关或者是相互依赖的对象提供一个接口,而不需要指定它们的具体类

这个设计模式的重点在于不需要指定它们的具体类:关键在于面向产品的接口编程,使用时并不知道具体实现是什么。

 

画一下UML类图:

AbstractFactory:抽象工厂角色,它声明了一组用于创建一种产品的方法,每一个方法对应一种产品,如上述类图中的AbstractFactory中就定义了两个方法,分别创建产品A和产品B。

ConcreteFactory:具体工厂角色,它实现了再抽象工厂中定义的创建产品的方法,生成一组具体产品,这些产品构成了一个产品种类,每一个产品都位于某个产品等级结构中,如上述类图中的ConcreteFactory1和ConcreteFactory2.

AbstractProduct:抽象产品角色,它为每种产品声明接口,比如上述类图中的AbstractProductA和AbstractProductB。

ConcreteProduct:具体产品角色,它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法,如上述类图中的ConcreteProductA1、ConcreteProductA2、ConcreteProductB1和ConcreteProductB2。

比如使用抽象工厂模式生产一辆汽车:

抽象产品类:轮胎、发动机、车窗等

具体产品类1:普通轮胎、普通发动机、普通车窗等

具体产品类2:越野轮胎、汽油发动机、防弹车窗等

抽象工厂类:生产轮胎、发动机、车窗等

具体工厂类1:生产普通轮胎、生产普通发动机、生产普通车窗等

具体工厂类2:生产越野轮胎、生产汽油发动机、生产防弹车窗等

它是为一组相关或者说相互依赖的对象提供一个接口。

写一下具体的代码吧。

抽象工厂类:

public abstract class AbstractFactory {
    public abstract AbstractProductA createProductA();

    public abstract AbstractProductB createProductB();
}

具体工厂类:

public class ConcreteFactory1 extends AbstractFactory {
    @Override public AbstractProductA createProductA() {
        return new ConcreteProductA1();
    }

    @Override public AbstractProductB createProductB() {
        return new ConcreteProductB1();
    }
}
public class ConcreteFactory2 extends AbstractFactory {
    @Override public AbstractProductA createProductA() {
        return new ConcreteProductA2();
    }

    @Override public AbstractProductB createProductB() {
        return new ConcreteProductB2();
    }
}

抽象产品类:

public abstract class AbstractProductA {
    public abstract void method();
}
public abstract class AbstractProductB {
    public abstract void method();
}

具体产品类:

public class ConcreteProductA1 extends AbstractProductA {
    @Override public void method() {
        System.out.println("具体产品类A1");
    }
}

public class ConcreteProductA2 extends AbstractProductA {
    @Override public void method() {
        System.out.println("具体产品类A2");
    }
}

public class ConcreteProductB1 extends AbstractProductB {
    @Override public void method() {
        System.out.println("具体产品类B1");
    }
}

public class ConcreteProductB2 extends AbstractProductB {
    @Override public void method() {
        System.out.println("具体产品类B2");
    }
}

使用时:

public class Client {
    public static void main(String[] args) {
        AbstractFactory factory1 = new ConcreteFactory1();
        AbstractFactory factory2 = new ConcreteFactory2();
        AbstractProductA productA1 = factory1.createProductA();
        AbstractProductB productB1 = factory1.createProductB();
        AbstractProductA productA2 = factory2.createProductA();
        AbstractProductB productB2 = factory2.createProductB();
        productA1.method();
        productB1.method();
        productA2.method();
        productB2.method();
    }
}

抽象工厂方法在使用时,面对抽象类编程,并不知道具体实现是什么。这样在修改时,就可以实现只修改创建的具体工厂类对象,而不需要修改代码的使用逻辑。

 

这篇对抽象产品模式的定义进行咬文嚼字,整篇都在解释定义,但是咬文嚼字才能真正地区分出它和工厂方法模式的区别~

 

 

参考资料:《Android源码设计模式》、《大话设计模式》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值