创建型模式 —— 工厂模式

本文详细介绍了工厂模式的三种类型:简单工厂模式、工厂方法模式和抽象工厂模式,包括它们的概念、结构、实现、优缺点及应用场景。通过对JDK源码中Collection.iterator方法的分析,进一步阐述了工厂模式在实际开发中的应用。
摘要由CSDN通过智能技术生成

工厂模式

在java中,万物皆为对象,这些对象都需要被创建,如果创建的时候直接new该对象,就会对该对象严重耦合,假如我们需要更换对象,所有new对象的地方都需要重新修改一遍,这就违背了开闭原则。如果使用工厂来生产对象,我们只需要和工厂打交道即可,由工厂来创建对象,就可以做到我们与对象解耦,如果需要更换对象,直接在工厂里更换对象即可。所以说,工厂模式最大的优点就是:解耦。

工厂模式的划分

一共有三种工厂模式:

  • 简单工厂模式(不属于GOF的23种经典设计模式)
  • 工厂方法模式
  • 抽象工厂模式

1 简单工厂模式

简单工厂不是一种设计模式,反而比较像是一种编程习惯。

1.1 结构

简单工厂包含如下角色:

  • 抽象产品:定义了产品的规范,描述了产品的主要特征和功能
  • 具体产品:实现或者继承抽象产品的子类
  • 具体工厂:提供了创建产品的方法,调用者通过该方法来创建产品
1.2 实现
//抽象产品
public abstract class Coffee {
   
    //获取咖啡名字
    public abstract String getName();
    //加糖
    public void addSugar(){
   
        System.out.println("加糖");
    }
    //加奶
    public void addMilk(){
   
        System.out.println("加奶");
    }
}
//具体产品
public class AmericanCoffee extends Coffee{
   
    @Override
    public String getName() {
   
        return "美式咖啡";
    }
}
//具体产品
public class LatteCoffee extends Coffee{
   
    @Override
    public String getName() {
   
        return "拿铁咖啡";
    }
}
//具体工厂
public class SimpleCoffeeFactory {
   
    //创建具体咖啡的方法
    public Coffee createCoffee(String type){
   
        //声明coffee变量,根据type获取不同coffee的子类对象
        Coffee coffee = null;
        if("American".equals(type)){
   
            coffee = new AmericanCoffee();
        }else if("Latte".equals(type)){
   
            coffee = new LatteCoffee();
        }else {
   
            throw new RuntimeException("对不起,本店没有您点的咖啡种类");
        }
        return coffee;
    }
}
//测试类
public class Test {
   
    public static void main(String[] args) {
   
    	//获取咖啡工厂
        SimpleCoffeeFactory simpleCoffeeFactory = new SimpleCoffeeFactory();
        //通过咖啡工厂根据type获取咖啡
        Coffee coffee = simpleCoffeeFactory.createCoffee("Latte");
        coffee.addMilk();
        System.out.println(coffee.getName());
    }
}

测试结果:
加奶
拿铁咖啡

1.3 优缺点

优点: 封装了创建对象的过程,可以通过不同的参数直接获取不同的对象,把对象的创建和业务逻辑层分开,这样就避免了以后修改客户代码,如果要实现新产品直接修改工厂类,而不需要在原代码中修改,这样就降低了客户代码修改的可能性,更加容易扩展。
缺点: 增加新产品时还是需要修改工厂类的代码,违背了“开闭原则”。

1.4 扩展

静态工厂
在开发中也有一部分人将工厂类中的创建对象的功能定义为静态的,这个就是静态工厂模式,它同样不属于23种设计模式。

//具体工厂
public class SimpleCoffeeFactory {
   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值