面试必问设计模式之工厂模式(超详细)

设计模式系列文章目录

如果本文对你们的开发之路有所帮助,请帮忙点个赞,您的支持是我坚持写博客的动力

前言

上一篇文章带着大家初探设计模式,本文将讲解设计模式的工厂模式

什么是工厂方法/说说工厂方法定义

  • 工厂模式是一种创建型设计模式
  • 定义一个用于创建对象的接口,让子类决定实例化哪一个类,让一个类的实例化延迟到子类
  • 把对象的创建和使用的过程分开

可以画出工厂模式吗,并简单说明下

类图

说明

  • 抽象类Product负责定义类的共性,实现对实现类ConceteProduct对抽象的定义
  • 抽象工厂Factory负责定义实现工厂的共性,具体创建实现类由 实现工厂ConcreteFactory实现

说说工厂模式的好处

  • 工厂模式可以实现代码解耦,将对象的创建和实现的过程分开。
  • 工厂模式使得代码具有可扩展性,定义好抽象工厂以及抽象类,扩展相对应的实现类即可。
  • 工厂模式使得代码易于维护,把对象创建的具体逻辑给隐藏起来了,交给工厂统一管理。实现类不需要知道具体地创建过程。

工厂模式有什么分类呢?

工厂模式主要分为三类:

  • 简单工厂模式
  • 工厂方法模式
  • 抽象工厂模式

下面将一一讲解这三种工厂模式

介绍下简单工厂吧

###概念

  • 实现类不需要关注对象的创建过程

优点:

  • 创建对象简单,通过名称即可创建对象

缺点

  • 违背开闭原则,每添加一个对象都需要修改工厂类

总结

简单工厂模式实现简单,但违背开闭原则,扩展性强

能不能用代码实现简单工厂

实现代码背景:实现联合支付功能,使得接入第三方支付简易

代码详见:https://gitee.com/janyxe/design_patterns

定义支付工厂,通过传不同的类型,实现不同的逻辑

class PayFactory{
    public static PayService toPay(String type){
        if ("ali".equals( type )){
            return new AliPayService();
        }
        if ("wechat".equals( type )){
            return new WeChatPayService();
        }

        return null;
    }
}

定义公共方法

public interface PayService {

    void pay();

}

通过实现公共方法,走不同的实现逻辑

public class AliPayService implements PayService {

    @Override
    public void pay() {
        System.out.println("使用支付宝支付...");
    }

}

public class WeChatPayService implements PayService {

    @Override
    public void pay() {
        System.out.println("使用微信支付");
    }

}
public class SimpleApp {

    public static void main(String[] args) {
        PayService payService = PayFactory.toPay("wechat");
        payService.pay();
    }
}

控制台输出:使用微信支付

简单介绍工厂方法

概念

  • 创建对象工作委托给具体工厂
  • 实现类不需要知道所需对象的类,只需要对应实现工厂类即可

优点

  • 屏蔽对象创建具体实现,调用者只需要实现接口即可

缺点

  • 增加了系统复杂度,每添加一个类都需要增加对应的工厂类

能不能用代码实现工厂方法

实现代码背景:通过不同的产品工厂实现不同产品的生产

代码详见:https://gitee.com/janyxe/design_patterns

定义产品生产公共接口

public interface Product {

    /**
     * 生产商品
     */
    void create();
}

不同产品实现

/**
 * 饮料类产品生产
 */
public class DrinksProduct implements Product {

    @Override
    public void create() {
        System.out.println("饮料类产品生产");
    }
}
/**
 * 食品类产品生产
 */
public class FoodProduct implements Product {

    @Override
    public void create() {
        System.out.println("食品类产品生产");
    }

}

定义产品工厂 生产公共方法

/**
 * 产品工厂创建产品
 */
public interface ProductFactory {

    void createProduct();
}

实现产品工厂,实现生产不同的产品

/**
 * 饮料类产品生产
 */
public class DrinksProduct implements Product {

    @Override
    public void create() {
        System.out.println("饮料类产品生产");
    }
}
/**
 * 食品类产品生产
 */
public class FoodProduct implements Product {

    @Override
    public void create() {
        System.out.println("食品类产品生产");
    }

}

调用工厂类 生产产品

public class MethodApp {

    public static void main(String[] args) {
        DrinksProductFactory drinksFactory = new DrinksProductFactory();
        drinksFactory.createProduct();

        FoodProductFactory foodFactory = new FoodProductFactory();
        foodFactory.createProduct();
    }
}

控制台输出

饮料类产品生产
食品类产品生产

概述下抽象工厂模式以及优缺点

概念

  • 需要一组对象完成某种功能或多组对象完成不同的功能

优点

  • 扩展性高,可通过一组对象实现某个功能

缺点

  • 不符合开闭原则,增加功能就需要修改原有代码

开闭原则:一个实体是允许在不改变它的源代码的前提下变更它的行为

能不能用代码实现工厂方法

实现代码背景:通过不同的产品工厂实现不同产品的生产

代码详见:https://gitee.com/janyxe/design_patterns

定义产品生产公共接口

public interface Product {

    /**
     * 生产商品
     */
    void create();
}

不同产品实现

/**
 * 饮料类产品生产
 */
public class DrinksProduct implements Product {

    @Override
    public void create() {
        System.out.println("饮料类产品生产");
    }
}
/**
 * 食品类产品生产
 */
public class FoodProduct implements Product {

    @Override
    public void create() {
        System.out.println("食品类产品生产");
    }

}

定义抽象产品创建方法

public abstract class AbstractProduct {

    /**
     * 抽象产品创建方法
     */
    public abstract Product create();

    public void creatProduct(){
        Product product = create();
        product.create();
    }

}

不同的产品实现抽象方法

/**
 * 生产饮料实现类
 */
public class ConcreteDrinksProduct extends AbstractProduct {

    @Override
    public Product create() {
        return new DrinksProduct();
    }

}
public class ConcreteFoodProduct extends AbstractProduct {

    @Override
    public Product create() {
        return new FoodProduct();
    }
}

生产产品,调用代码

public class AbstractApp {

    public static void main(String[] args) {
        // 生产饮料
        AbstractProduct drinksProduct = new ConcreteDrinksProduct();
        drinksProduct.creatProduct();

        // 生产食品
        AbstractProduct foodProduct = new ConcreteFoodProduct();
        foodProduct.creatProduct();
    }

}

控制台输出

饮料类产品生产
食品类产品生产
评论 53
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

janyxe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值