设计模式之工厂模式

15 篇文章 0 订阅
9 篇文章 0 订阅

2、工厂模式

本文结合代码的方式,描述工厂模式。
工厂模式实现了创建者和调用者的分离

核心本质:

  • 实例化对象,用工厂方法代替new操作
  • 将选择实现类、创建对象统一管理和控制,将调用者和实现类解耦

2.1、工厂模式分类

  • 简单工厂模式
    用来生产同一等级结构的任意产品(对于新增的产品需要修改已有的代码)
  • 工厂方法模式
    用来生产同一等级结构的固有产品(支持增加任意产品)
  • 抽象工厂模式
    用来生产不同产品族的全部产品,(不能增加新的产品,可以增加产品族)

2.2 面向对象设计的基本原则

  • OCP(开闭原则):一个软件实体应当对扩展开放,对修改关闭
  • DIP(依赖倒置原则):要针对接口编程,不要针对实现编程
  • LOD(迪米特法则):只与你直接的朋友通信,避免和陌生人通信

2.3、简单工厂模式

简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法
通过接收的参数的不同来返回不同的对象实例
对于新增的产品无能为力,不修改代码的话,无法完成拓展

public interface Car {
    void run();
}
public class BaoMa implements Car{
    @Override
    public void run() {
        System.out.println("宝马在跑……");
    }
}
public class BenChi implements Car {
    @Override
    public void run() {
        System.out.println("奔驰在跑……");
    }
}
/**
 * 简单工厂类1
 * @author tqq
 * @date 2021-04-26-12:33
 */
public class CarFactory {
    public static Car createCar(String type){
        if ("宝马".equals(type)){
            return new BaoMa();
        }else if("奔驰".equals(type)){
            return new BenChi();
        }else {
            return null;
        }
    }
}
/**
 * 简单工厂类2
 * @author tqq
 * @date 2021-04-26-12:56
 */
public class CarFactory2 {
    public static Car createBaoMa(){
        return new BaoMa();
    }
    public static Car createBenChi(){
        return new BenChi();
    }
}
/**
 * 客户端调用
 * 简单工厂情况下
 * @author tqq
 * @date 2021-04-26-12:37
 */
public class Client2 {
    public static void main(String[] args) {
        Car c1 = CarFactory.createCar("宝马");
        Car c2 = CarFactory.createCar("奔驰");
        c1.run();
        c2.run();
        Car baoMa = CarFactory2.createBaoMa();
        Car benChi = CarFactory2.createBenChi();

    }
}

2.4、工厂方法模式

  • 为了避免简单工厂模式的缺点,不完全满足OCP(开闭原则)
    工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目
    或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。

用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族)

public interface Car {
    void run();
}
public interface CarFactory {
    public Car createCar();
}
public class BaoMa implements Car {
    @Override
    public void run() {
        System.out.println("宝马在跑……");
    }
}
public class BenChi implements Car {
    @Override
    public void run() {
        System.out.println("奔驰在跑……");
    }
}
public class BaoMaFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new BaoMa();
    }
}
public class BenChiFactory implements CarFactory{
    @Override
    public Car createCar() {
        return new BenChi();
    }
}
/**
 * 客户端
 */
public class Client {
    public static void main(String[] args) {
        Car baoma = new BaoMaFactory().createCar();
        baoma.run();

        Car benchi = new BenChiFactory().createCar();
        benchi.run();

    }
}

2.5、抽象工厂模式

代码以建造一辆汽车来进行展示

public interface Engine {
    void run();
}
class LuxuryEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转的快");
    }
}
class LowEngine implements Engine{

    @Override
    public void run() {
        System.out.println("转的慢");
    }
}
public interface Seat {
    void message();
}
class LuxurySeat implements Seat{

    @Override
    public void message() {
        System.out.println("坐着舒服");
    }
}
class LowSeat implements Seat{

    @Override
    public void message() {
        System.out.println("坐着一般");
    }
}

public interface Tyre {
    void wheel();
}
class LuxuryTyre implements Tyre{

    @Override
    public void wheel() {
        System.out.println("耐磨");
    }
}
class LowTyre implements Tyre{

    @Override
    public void wheel() {
        System.out.println("耐磨性一般");
    }
}

public interface CarFactory {
    Engine createEngine();
    Seat createSeat();
    Tyre createTyre();
}
public class LowCarFactory implements CarFactory{
    @Override
    public Engine createEngine() {
        return new LowEngine();
    }

    @Override
    public Seat createSeat() {
        return new LowSeat();
    }

    @Override
    public Tyre createTyre() {
        return new LowTyre();
    }
}

public class LuxuryCarFactory implements CarFactory{
    @Override
    public Engine createEngine() {
        return new LuxuryEngine();
    }

    @Override
    public Seat createSeat() {
        return new LuxurySeat();
    }

    @Override
    public Tyre createTyre() {
        return new LuxuryTyre();
    }
}

/**
 * 客户端
 * 抽象工厂模式
 * @author tqq
 * @date 2021-04-26-14:36
 */
public class Client {
    public static void main(String[] args) {
        CarFactory lowCarFactory = new LowCarFactory();
        Engine engine = lowCarFactory.createEngine();
        engine.run();
    }
}

2.6、总结

  • 简单工厂模式(静态工厂模式)
    虽然某种程度不符合设计原则,但实际用的最多
  • 工厂方法模式
    不修改已有类的前提下,通过新增新的工厂类实现扩展
  • 抽象工厂模式
    不可以增加产品,但是可以增加产品族

2.7、 应用场景

  • spring中IOC容器创建bean对象
  • XML解析时的DocumentBuilderFactory创建解析器对象
  • 反射中Class对象的newInstance()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值