23种设计模式之抽象工厂模式(Abstract Factory Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的抽象工厂模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。
如果文章有什么需要改进的地方还请大佬不吝赐教
小威在此先感谢各位大佬啦~~
在这里插入图片描述

个人主页:小威要向诸佬学习呀
个人简介:大家好,我是小威,一个想要与大家共同进步的男人
目前状况:24届毕业生,在一家满意的公司实习

欢迎大家:这里是CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬

以下正文开始

文章目录

  • 抽象工厂概念
  • 抽象工厂案例
  • 图书推荐

23种设计模式之抽象工厂模式(Abstract Factory Pattern)_第1张图片

抽象工厂概念

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

抽象工厂模式的核心思想是将对象的创建与使用分离开来,从而实现系统的松耦合。在抽象工厂模式中,客户端不需要知道具体产品的类名,只需要知道产品的抽象类或接口即可。

抽象工厂模式包含以下角色:

  1. 抽象工厂:定义了一组创建产品的方法,每个方法对应一个具体的产品族。

  2. 具体工厂:实现抽象工厂接口,负责创建一组具体的产品。

  3. 抽象产品:定义了产品的公共接口。

  4. 具体产品:实现抽象产品接口,是具体工厂创建的产品。

抽象工厂模式的优点:

  1. 可以在不修改客户端代码的情况下,更换产品系列。

  2. 可以保证客户端使用的产品是同一系列的,避免了产品之间的不兼容问题。

  3. 可以将产品的创建与使用分离开来,从而实现系统的松耦合。

抽象工厂模式的缺点:

  1. 增加新的产品族比较困难,需要修改抽象工厂和所有的具体工厂。

  2. 增加新的产品等级结构比较困难,需要修改抽象工厂和所有的具体工厂。

抽象工厂模式的适用场景:

  1. 系统需要一组相关的产品,而这些产品之间存在一定的关联或依赖关系。

  2. 系统需要在不同的平台或不同的环境下使用不同的产品。

  3. 系统需要提供一个产品类库,而且这些产品的实现都必须相互兼容。

抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们的具体类。抽象工厂模式是工厂方法模式的升级版,它不仅可以创建单个对象,还可以创建一系列相关的对象。

抽象工厂案例

下面我们来看一个使用抽象工厂模式的案例:

假设我们正在开发一个电子商务网站,需要实现一个购物车功能。购物车分为两类:普通购物车和VIP购物车。普通购物车中包含商品、数量和价格,VIP购物车中除了包含商品、数量和价格外,还包含积分和优惠券。

为了实现这个购物车功能,我们可以使用抽象工厂模式。首先,我们需要定义一个抽象工厂接口,用于创建购物车和购物车中的商品对象。代码如下:

// 抽象工厂接口
public interface CartFactory {
    Cart createCart();
    Product createProduct(String name, int price);
}

// 购物车接口
public interface Cart {
    void addProduct(Product product, int quantity);
    void removeProduct(Product product);
    double getTotalPrice();
}

// 商品接口
public interface Product {
    String getName();
    int getPrice();
}

然后,我们需要实现具体的工厂类来创建普通购物车和VIP购物车以及对应的商品对象。代码如下:

// 普通购物车工厂
public class NormalCartFactory implements CartFactory {
    @Override
    public Cart createCart() {
        return new NormalCart();
    }

    @Override
    public Product createProduct(String name, int price) {
        return new NormalProduct(name, price);
    }
}

// VIP购物车工厂
public class VipCartFactory implements CartFactory {
    @Override
    public Cart createCart() {
        return new VipCart();
    }

    @Override
    public Product createProduct(String name, int price) {
        return new VipProduct(name, price);
    }
}

// 普通购物车
public class NormalCart implements Cart {
    private Map<Product, Integer> products = new HashMap<>();

    @Override
    public void addProduct(Product product, int quantity) {
        products.put(product, quantity);
    }

    @Override
    public void removeProduct(Product product) {
        products.remove(product);
    }

    @Override
    public double getTotalPrice() {
        double totalPrice = 0;
        for (Map.Entry<Product, Integer> entry : products.entrySet()) {
            Product product = entry.getKey();
            int quantity = entry.getValue();
            totalPrice += product.getPrice() * quantity;
        }
        return totalPrice;
    }
}

// VIP购物车
public class VipCart implements Cart {
    private Map<Product, Integer> products = new HashMap<>();
    private int points;
    private String coupon;

    @Override
    public void addProduct(Product product, int quantity) {
        products.put(product, quantity);
    }

    @Override
    public void removeProduct(Product product) {
        products.remove(product);
    }

    @Override
    public double getTotalPrice() {
        double totalPrice = 0;
        for (Map.Entry<Product, Integer> entry : products.entrySet()) {
            Product product = entry.getKey();
            int quantity = entry.getValue();
            totalPrice += product.getPrice() * quantity;
        }
        return totalPrice;
    }

    public void addPoints(int points) {
        this.points += points;
    }

    public void useCoupon(String coupon) {
        this.coupon = coupon;
    }
}

// 普通商品
public class NormalProduct implements Product {
    private String name;
    private int price;

    public NormalProduct(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getPrice() {
        return price;
    }
}

// VIP商品
public class VipProduct implements Product {
    private String name;
    private int price;

    public VipProduct(String name, int price) {
        this.name = name;
        this.price = price;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public int getPrice() {
        return price;
    }
}

最后,我们可以使用这些类来创建购物车和商品对象。代码如下:

public class Client {
    public static void main(String[] args) {
        CartFactory normalCartFactory = new NormalCartFactory();
        Cart normalCart = normalCartFactory.createCart();
        Product normalProduct = normalCartFactory.createProduct("普通商品", 100);
        normalCart.addProduct(normalProduct, 1);
        System.out.println("普通购物车总价:" + normalCart.getTotalPrice());

        CartFactory vipCartFactory = new VipCartFactory();
        Cart vipCart = vipCartFactory.createCart();
        Product vipProduct = vipCartFactory.createProduct("VIP商品", 200);
        vipCart.addProduct(vipProduct, 1);
        vipCart.addPoints(100);
        vipCart.useCoupon("VIP优惠券");
        System.out.println("VIP购物车总价:" + vipCart.getTotalPrice());
    }
}

运行结果如下:

普通购物车总价:100.0
VIP购物车总价:200.0

通过抽象工厂模式,我们可以轻松地创建不同类型的购物车和商品对象,而无需关注它们的具体实现,从而提高了代码的灵活性和可维护性。

图书推荐

本期推荐书籍为《产业链金融平台设计与实现》

结合与金融机构对接的真实案例,通过业务+技术+法律合规性层面的介绍,完整讲述产业链金融平台建设全过程,助力企业开辟数字化转型的新赛道。
构建以自己为核心的供应链金融平台,助力企业开辟数字化转型的新赛道。

23种设计模式之抽象工厂模式(Abstract Factory Pattern)_第2张图片

本书从产业链金融的起源讲起,结合实际案例讲解产业链金融平台的前台设计、技术中台设计、数据平台设计、风控设计及信息安全的核心要点,既体现了传统行业的业务创新、数字转型的探索过程,又介绍了当前主流银行的开放性建设成果。读者不但能全方位地了解产业链金融平台的建设过程,还能针对自己感兴趣的方面进行深入学习。

本书共6章,第1章介绍了产业链金融的发展、变革历程,以及对传统企业的核心价值;第2章介绍了系统核心功能的设计及在线签约、实名认证等技术的原理;第3章介绍了结合容器云技术、微服务技术与DevOps技术构建技术中台的过程,以及对接开放银行、央行征信的过程;第4章介绍了开源大数据平台的建设及数据仓库的设计思路;第5章基于Python的机器学习库介绍了智能风控的开发过程;第6章介绍了在产业链金融平台建设过程中如何规避信息安全的法律风险。

本书内容全面,且围绕开源技术展开介绍,实用性极强,特别适合建设产业链金融平台的传统企业架构师、开发人员及产品人员阅读,也适合对开源的技术中台、大数据平台及信用风控感兴趣的开发人员阅读。

粉丝福利:评论区任意留言可参与活动抽奖(可评论最多五条,抽取三名欧皇)

京东自营购买链接:点击查看详情

好了,本篇文章就先分享到这里了,后续将会继续介绍23种设计模式之其他模式,感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了,如果有什么疑问的地方请指出,诸佬们一起讨论
希望能和诸佬们一起努力,今后我们顶峰相见
再次感谢各位小伙伴儿们的支持

在这里插入图片描述

你可能感兴趣的:(一天一种设计模式,设计模式,抽象工厂模式,java)