带你理解java设计模式-工厂模式

一、什么是工厂模式?

 工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳实践。工厂模式将对象的实例化放在工厂类内部,这样调用者被屏蔽了对象的创建逻辑,只需要关心返回的对象。
 工厂模式主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。

二、简单工厂模式

 这个例子是offer的(哈哈哈),首先创建一个通用接口IOffer接口,这个接口有个offer方法负责获得offer,接口有三个实现类,分别是腾讯阿里华为的offer,调用方只需要给offer工厂类offer的名字就可以获得offer啦!
![在这里插入图片描述](https://img-blog.csdnimg.cn/f918fda9781e4073857685ff28388817.png

1.代码

IOffer抽象类

package com.dls;

public abstract class IOffer {
    public abstract String offer();
}

阿里offer实现类

package com.dls;

public class AlibabaOffer extends IOffer{
    @Override
    public String offer() {
        return "恭喜收到阿里offer";
    }
}

华为offer实现类

package com.dls;

public class HuaWeiOffer extends IOffer{
    @Override
    public String offer() {
        return "恭喜收到华为offer";
    }
}

腾讯offer实现类

package com.dls;

public class TencentOffer extends IOffer{

    @Override
    public String offer() {
        return "恭喜收到腾讯offer";
    }
}

offer工厂类

package com.dls;

public class OfferFactory {
    public IOffer offer(String name) {
        if (name == "Alibaba") {
            return new AlibabaOffer();
        } else if (name == "HuaWei") {
            return new HuaWeiOffer();
        } else if (name == "Tencent") {
            return new TencentOffer();
        } else {
            return null;
        }
    }
}


2.调用结果

package com.dls;

public class test {
    public static void main(String[] args) {
        OfferFactory offerFactory = new OfferFactory();
        System.out.println("offer工厂:我是offer工厂,请问你想要什么offer呢?");
        System.out.println("调用方:麻烦给我华为offer");
        IOffer offer = offerFactory.offer("HuaWei");
        if (offer != null) {
            System.out.println(offer.offer());
        }
    }
}

运行截图如下

在这里插入图片描述

 以上就是简单工厂模式的应用,但是相信心细的你已经发现了,如果又有别的offer实现类,比如字节跳动的offer,就要在offer工厂里面在加一条else if语句,每当有一个新的offer,就要改动offer工厂,这就违反了“开闭原则”,工厂类的职责也过重。下面让我来介绍一下工厂方法模式。

三、工厂方法模式

 首先修改工厂类为抽象工厂类,创建对象的具体逻辑由抽象方法来实现
在这里插入图片描述

1.代码

Offer工厂抽象类

package com.dls;

public abstract class OfferFactory {
    public IOffer offer() {
        return createOffer();
    }

    protected abstract IOffer createOffer();
}

华为Offer工厂类

package com.dls;

public class HuaWeiOfferFactory extends OfferFactory{
    @Override
    public IOffer createOffer() {
        return new HuaWeiOffer();
    }
}

阿里Offer工厂类

package com.dls;

public class AlibabaOfferFactory extends OfferFactory{
    @Override
    public IOffer createOffer() {
        return new AlibabaOffer();
    }
}

腾讯工厂类

package com.dls;

public class TencentOfferFactory extends OfferFactory{
    @Override
    public IOffer createOffer() {
        return new TencentOffer();
    }
}

2.调用结果

 

在这里插入图片描述

运行截图如下
 

在这里插入图片描述
 
 以上就是工厂方法的实现。可以看到,每当有新的offer实现类时,我们不需要修改Offer工厂的代码,只需要添加新的Offer工厂实现类以及Offer类,这样工厂的设计就符合开闭原则,但是这也有缺点,每增加一个新的Offer都需要添加一个Offer类和工厂实现类,使得系统类的个数增加,在一定程度上增加了系统的复杂度,同时也增加了Offer类的依赖。

四、抽象工厂模式

 定义功能更为强大的抽象工厂类,一个继承类只能提供同一产品族中的对象

1.代码

抽象工厂类

public abstract class AbstractOfferFactory {
    public abstract IOffer giveOffer(); //offer
    public abstract ITripartiteAgreement giveTripartiteAgreement();//三方
}

抽象Offer类

public abstract class IOffer {
    public abstract String offer();
}

抽象三方协议类

public abstract class ITripartiteAgreement {
    public abstract String tripartiteAgreement();
}

百度Offer实现类

public class BaiduOffer extends IOffer {
    @Override
    public String offer() {
        return "百度Offer";
    }
}

百度三方协议类

public class BaiduTripartiteAgreement extends ITripartiteAgreement {
    @Override
    public String tripartiteAgreement() {
        return "百度三方";
    }
}

快手Offer类

public class KwaiOffer extends IOffer {
    @Override
    public String offer() {
        return "快手Offer";
    }
}

快手三方协议类

public class KwaiTripartiteAgreement extends ITripartiteAgreement {
    @Override
    public String tripartiteAgreement() {
        return "快手三方";
    }
}

百度工厂实现类

public class BaiduOfferFactory extends AbstractOfferFactory{
    @Override
    public IOffer giveOffer() {
        return new BaiduOffer();
    }

    @Override
    public ITripartiteAgreement giveTripartiteAgreement() {
        return new BaiduTripartiteAgreement();
    }
}

快手工厂实现类

public class KwaiOfferFactory extends AbstractOfferFactory{
    @Override
    public IOffer giveOffer() {
        return new KwaiOffer();
    }

    @Override
    public ITripartiteAgreement giveTripartiteAgreement() {
        return new KwaiTripartiteAgreement();
    }
}

2.调用结果

 
在这里插入图片描述
 
 
运行截图如下
 
在这里插入图片描述
 
 抽象工厂模式适用于产品族之间有明显差异的情况。当增加新的产品族时,不需要修改以已有的系统,符合”开闭原则:。但当增加新的产品等级结构时,就要修改抽象工厂代码,这显然会带来较大的不便违背“开闭原则”。

五、总结

 总之,简单工厂模式是最简单的工厂模式,但它违反了开闭原则和单一职责原则;工厂方法模式通过引入子类来解决问题,但当产品种类越来越多时,会增加系统的复杂度;抽象工厂模式通过将对象的创建和使用分离,提供了一个统一的接口来创建不同产品族的对象,它是所有工厂设计模式中最复杂的一种,但也是最强大和最灵活的一种。在实际应用中,可以根据具体的需求来选择合适的工厂模式。

  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值