设计模式-工厂模式-让你彻底搞懂

目录

一、概述

二、分类

1. 简单工厂模式

(1) 组成

(2) 关系图

(3) 类图

(4) 代码

(5) 优缺点

(6) 适用场景

2. 工厂方法模式

(1) 组成

(2) 关系图

(3) 类图

(4) 代码

(5) 优缺点

(6) 使用场景

3. 抽象工厂模式

(1) 组成

(2) 关系图

(3) 类图

(4) 代码

(5) 优缺点

(6) 使用场景


一、概述

        工厂模式是Java开发中最常用的设计模式之一, 核心价值是隔离变化点通过使用工厂模式,可以将对象的创建逻辑封装在一个工厂类中,而不是在客户端代码中直接实例化对象,这样可以提高代码的可维护性和可扩展性。

二、分类

1. 简单工厂模式

(1) 组成
  1. 抽象产品(Abstract Product):描述某类产品的功能,并定义了该类产品的规范。
  2. 具体产品(Concrete Product):是抽象产品的具体实现,完全遵循抽象产品的规范。
  3. 具体工厂(Concrete Factory):提供了创建产品的方法,调用者通过该方法来获取产品。
(2) 关系图

(3) 类图

(4) 代码
public abstract class Phone {
    public abstract void call();

    public abstract void video();
}
public class HuaWPhone extends Phone {
    @Override
    public void call() {
        System.out.println("Hua wei phone call...");
    }

    @Override
    public void video() {
        System.out.println("Hua wei phone video...");
    }
}
public class XiaoMPhone extends Phone {
    @Override
    public void call() {
        System.out.println("xiao mi phone call...");
    }

    @Override
    public void video() {
        System.out.println("xiao mi phone video...");
    }
}
public class SimplePhoneFactory {
    public Phone creatPhone(String type) {
        Phone phone = null;
        if ("huaw".equals(type)) {
            phone = new HuaWPhone();
        } else {
            phone = new XiaoMPhone();
        }
        return phone;
    }
}
public class Consumer {
    public void usePhone() {
        SimplePhoneFactory factory = new SimplePhoneFactory();
        Phone huawei = factory.creatPhone("huawei");
        huawei.call();
        huawei.video();
    }
}
(5) 优缺点

优点:适合简单场景,实现容易。

缺点:不够灵活,违反了开闭原则。

(6) 适用场景
  1. 文件解析,根据不同的文件格式,创建不同的文件解析器。
  2. 支付渠道选择,根据不同的支付方式,创建不同的支付实例。

2. 工厂方法模式

(1) 组成
  1. 抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  2. 具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 抽象产品(Abstract Product):描述产品的功能,并定义了该类产品的规范。
  4. 具体产品(Concrete Product):是抽象产品的具体实现,完全遵循抽象产品的规范。
(2) 关系图

(3) 类图

(4) 代码
public abstract class Phone {
    public abstract void call();
    public abstract void video();
}
public class HuaWPhone extends Phone{
    @Override
    public void call() {
        System.out.println("Hua wei phone call...");
    }

    @Override
    public void video() {
        System.out.println("Hua wei phone video...");
    }
}
public class XiaoMPhone extends Phone{
    @Override
    public void call() {
        System.out.println("xiao mi phone call...");
    }

    @Override
    public void video() {
        System.out.println("xiao mi phone video...");
    }
}
public interface PhoneFactory {
    public Phone creatPhone();
}
public class HuaWPhoneFactory implements PhoneFactory{
    @Override
    public Phone creatPhone() {
        return new HuaWPhone();
    }
}
public class XiaoMPhoneFactory implements PhoneFactory{
    @Override
    public Phone creatPhone() {
        return new XiaoMPhone();
    }
}
public class Consumer {
    private PhoneFactory phoneFactory;

    public Consumer(PhoneFactory phoneFactory) {
        this.phoneFactory = phoneFactory;
    }

    public void usePhone(){
        Phone phone = phoneFactory.creatPhone();
        phone.call();
        phone.video();
    }

}
(5) 优缺点
        优点:符合开闭原则,
        缺点:产品拓展比较复杂,因为新增一个产品就需要添加具体的产品和具体的工厂。
(6) 使用场景
  1. Java集合框架的迭代器
  2. Spring的BeanFactory

3. 抽象工厂模式

(1) 组成
  1. 多类抽象工厂(Abstract Factory):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。
  2. 多类具体工厂(Concrete Factory):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
  3. 多类抽象产品(Abstract Product):描述产品的功能,并定义了该类产品的规范。
  4. 多类具体产品(Concrete Product):是抽象产品的具体实现,完全遵循抽象产品的规范。
(2) 关系图

(3) 类图

(4) 代码
public interface Phone {
    public void call();

    public void video();
}
public class HuaWPhone implements Phone {
    @Override
    public void call() {
        System.out.println("hua wei phone call");
    }

    @Override
    public void video() {
        System.out.println("hua wei phone video");
    }
}
public class XiaoMPhone implements Phone {
    @Override
    public void call() {
        System.out.println("xiao mi phone call");
    }

    @Override
    public void video() {
        System.out.println("xiao mi phone video");
    }
}
public interface Computer {
    public void network();
}
public class HuaWComputer implements Computer {
    @Override
    public void network() {
        System.out.println("hua wei computer network");
    }
}
public class XiaoMComputer implements Computer {
    @Override
    public void network() {
        System.out.println("xiao mi computer network");
    }
}
public interface ProductFactotry {
    public Phone createPhone();

    public Computer createComputer();
}
public class HuaWFactory implements ProductFactotry {
    @Override
    public Phone createPhone() {
        return new HuaWPhone();
    }

    @Override
    public Computer createComputer() {
        return new HuaWComputer();
    }
}
public class XiaoMFactory implements ProductFactotry {
    @Override
    public Phone createPhone() {
        return new XiaoMPhone();
    }

    @Override
    public Computer createComputer() {
        return new XiaoMComputer();
    }
}
public class Consumer {
    private ProductFactotry productFactotry;

    public Consumer(ProductFactotry productFactotry) {
        this.productFactotry = productFactotry;
    }

    public void consume() {
        Computer computer = productFactotry.createComputer();
        computer.network();
        Phone phone = productFactotry.createPhone();
        phone.call();
    }
}
(5) 优缺点

       优点:保证客户端始终只使用同一个产品族(品牌)中的对象。

       缺点:当我们新增一个产品时,所有的工厂类会对应的做出定制化修改。

(6) 使用场景
  1. 跨平台UI库
  2. 不同数据库的访问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值