设计模式之抽象工厂模式

定义

提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。

简而言之,就是工厂不在只生产面包,它同时还可以生产辣条,糖果等食品,转型成一个食品工厂。可以生产多种食品类产品,就是说从单一食品种类面包生产,到支持多种类型的食品生产的工厂。

UML类图

在这里插入图片描述

代码实现

ProductA.java

public abstract class ProductA {

    public abstract void methodA();
}

ProductB.java

public abstract class ProductB {

    public abstract void methodB();
}

Factory.java

public abstract class Factory {

    public abstract ProductA methodFactoryA();

    public abstract ProductB methodFactoryB();
}

ConcreteProductA1.java

public class ConcreteProductA1 extends ProductA {

    @Override
    public void methodA() {
        System.out.println("method: ConcreteProductA1");
    }
}

ConcreteProductA2.java

public class ConcreteProductA2 extends ProductA {

    @Override
    public void methodA() {
        System.out.println("method: ConcreteProductA2");
    }
}

ConcreteProductB1.java

public class ConcreteProductB1 extends ProductB {

    @Override
    public void methodB() {
        System.out.println("method: ConcreteProductB1");
    }
}

ConcreteProductB2.java

public class ConcreteProductB2 extends ProductB {

    @Override
    public void methodB() {
        System.out.println("method: ConcreteProductB2");
    }
}

ConcreteFactory1.java

public class ConcreteFactory1 extends Factory {
    @Override
    public ProductA methodFactoryA() {
        return new ConcreteProductA1();
    }

    @Override
    public ProductB methodFactoryB() {
        return new ConcreteProductB1();
    }
}

ConcreteFactory2.java

public class ConcreteFactory2 extends Factory {
    @Override
    public ProductA methodFactoryA() {
        return new ConcreteProductA2();
    }

    @Override
    public ProductB methodFactoryB() {
        return new ConcreteProductB2();
    }
}

Main.java

Factory factory = new ConcreteFactory1();
ProductA productA = factory.methodFactoryA();
ProductB productB = factory.methodFactoryB();
productA.methodA();
productB.methodB();

factory = new ConcreteFactory2();
productA = factory.methodFactoryA();
productB = factory.methodFactoryB();
productA.methodA();
productB.methodB();

优缺点

主要优点

  1. 抽象工厂模式隔离了具体类的生成,使得客户并不需要知道什么被创建。由于这种隔离,更换一个具体工厂就变得相对容易,所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此只需改变具体工厂的实例,就可以在某种程度上改变整个软件系统的行为。

  2. 当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。

  3. 增加新的产品族很方便,无须修改已有系统,符合“开闭原则”。

主要缺点

  1. 增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了“开闭原则”。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值