java设计模式——工厂方法模式(初学者必看)

目录

工厂方法模式概念

UML图

工厂方法的实例

首先有一个抽象工厂

具体的工厂类需要实现这个抽象工厂的接口

抽象产品类

具体产品类

优缺点

优点

缺点


工厂方法模式概念

        当我们需要创建不同类型的对象时,可以使用工厂方法模式。这种模式可以让我们根据需要创建具体的对象,而不需要在代码中直接实例化它们。

        如果我们使用简单工厂模式来创建飞机,可能会遇到一些问题。比如,简单工厂模式可以创建直升机、战斗机和波音747,但如果我们想要新增一个水上飞机,就需要修改工厂的源代码。这明显违反了开闭原则,即对扩展开放,对修改关闭。为了解决这个问题,我们可以使用工厂方法模式。工厂方法模式提供一个抽象的工厂接口,让子类来决定具体创建哪个对象的实例。每个具体工厂类负责创建一种特定类型的产品。

        工厂方法模式的核心思想是将对象的创建延迟到子类中。这样,当我们需要新增一种产品时,只需要创建一个新的具体产品类和对应的具体工厂类,而无需修改已有的代码。

        通过使用工厂方法模式,我们可以实现代码的扩展性和灵活性。新增产品时,只需添加相应的具体产品类和具体工厂类,不会对已有代码造成影响。而且,客户端只需要关注抽象工厂类和产品类的接口,无需关心具体的创建细节。

        但需要注意的是,工厂方法模式会增加系统的复杂性。每个具体产品都需要对应一个具体工厂类,这会增加类的数量。因此,在选择使用工厂方法模式时,我们需要考虑系统的可维护性和可读性。

UML图

Product:它是定义产品的接口,是工厂方法模式所创建的产品的父类。

ConcreteProduct:具体产品.

Factory:抽象工厂类中声明了工厂方法。

ConcreteFactory:具体的工厂方法,继承了抽象工厂类,用来生产具体的对象。

工厂方法的实例

首先有一个抽象工厂

/**
 * 抽象工厂类
 */
public interface IFactory {

    IProduct createPro(String params);
    
}

具体的工厂类需要实现这个抽象工厂的接口

        实现了公共工厂方法,并返回一个具体产品类的实例对象。通常情况下,与具体产品类一一对应。

/**
 * 具体工厂类
 */
public class FacImplA implements IFactory {

    // 创建产品A
    @Override
    public IProduct createPro(String params) {
        ProImplA pro = new ProImplA();
        // 执行相关业务逻辑
        return pro;
    }
    
}

抽象产品类

        工厂方法模式所创建对象的公共父类,定义了一组具有子类共性的公共方法,和子类独的抽象方法。

/**
 * 抽象产品类
 */
public interface IProduct {

    // 公共方法
    default void methodShared(){
        // 业务逻辑
    }

    // 不同方法
    void methodDiff(String params);
    
}

具体产品类

/**
 * 具体产品类
 */
public class ProImplA implements IProduct {

    // 不同执行逻辑的方法
    @Override
    public void methodDiff(String params) {
        // 不同处理逻辑
    }
    
}

优缺点

优点

        能够让工厂自主的确定创建何种产品对象,而具体的创建细节进行隐藏封装。

        在加入新的产品时无须修改抽象工厂和抽象产品提供的接口,只需要增加一个具体工厂和一个具体产品即可,极大的提高了程序的扩展性。

缺点

        每个具体产品都需要一个与之对应的具体工厂类,使得系统中类的个数成对增加,增加了系统的复杂度,有更多的类需要编辑和运行,带来了一些额外的开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值