设计模式学习笔记(3)——创建型——抽象工厂模式

抽象工厂(AbstractFactory)模式的定义:是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。

适用场景:

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级结构的产品。
  • 系统一次只可能消费其中某一族产品,即同族的产品一起使用。

优点:

  • 可以在类的内部对产品族中相关联的多等级产品共同管理,而不必专门引入多个新的类来进行管理。
  • 当增加一个新的产品族时不需要修改原代码,满足开闭原则。

缺点:

  • 当增加一个新的产品系列时,要修改所有工厂类

结构图:

类图:

 

代码实现:

//抽象工厂
public interface AbstractFactory {
    ProductA newProductA();

    ProductB newProductB();
}

//工厂1
public class Factory1 implements AbstractFactory {
    @Override
    public ProductA newProductA() {
        return new ProductA1();
    }

    @Override
    public ProductB newProductB() {
        return new ProductB1();
    }
}

//工厂2
public class Factory2 implements AbstractFactory {
    @Override
    public ProductA newProductA() {
        return new ProductA2();
    }

    @Override
    public ProductB newProductB() {
        return new ProductB2();
    }
}


//抽象产品A系列
public interface ProductA {
    void getInfo();
}

//产品A系列中的A1产品
public class ProductA1 implements ProductA {
    @Override
    public void getInfo() {
        System.out.println("我是产品A系列中的A1产品");
    }
}

//产品A系列中的A2产品
public class ProductA2 implements ProductA {
    @Override
    public void getInfo() {
        System.out.println("我是产品A系列中的A2产品");
    }
}


//抽象产品B系列
public interface ProductB {
    void getInfo();
}
//产品B系列中的B1产品
public class ProductB1 implements ProductB {
    @Override
    public void getInfo() {
        System.out.println("我是产品B系列中的B1产品");
    }
}

//产品B系列中的B2产品
public class ProductB2 implements ProductB {
    @Override
    public void getInfo() {
        System.out.println("我是产品B系列中的B2产品");
    }
}


//客户端
public class Test {
    public static void main(String[] args) {
        //只要拿到一个工厂,就能拿到工厂下的所有系列产品
        AbstractFactory factory1 = new Factory1();
        ProductA productA1 = factory1.newProductA();
        ProductB productB1 = factory1.newProductB();

        System.out.println("工厂1:");
        productA1.getInfo();
        productB1.getInfo();

        AbstractFactory factory2 = new Factory2();
        ProductA productA2 = factory2.newProductA();
        ProductB productB2 = factory2.newProductB();
        System.out.println("=========================");
        System.out.println("工厂2:");
        productA2.getInfo();
        productB2.getInfo();
    }
}


 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值