java设计模式-工厂模式
一、什么是工厂模式?
工厂模式是一种创建型设计模式,它提供了一种创建对象的最佳实践。工厂模式将对象的实例化放在工厂类内部,这样调用者被屏蔽了对象的创建逻辑,只需要关心返回的对象。
工厂模式主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。
二、简单工厂模式
这个例子是offer的(哈哈哈),首先创建一个通用接口IOffer接口,这个接口有个offer方法负责获得offer,接口有三个实现类,分别是腾讯阿里华为的offer,调用方只需要给offer工厂类offer的名字就可以获得offer啦!
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.调用结果
运行截图如下
抽象工厂模式适用于产品族之间有明显差异的情况。当增加新的产品族时,不需要修改以已有的系统,符合”开闭原则:。但当增加新的产品等级结构时,就要修改抽象工厂代码,这显然会带来较大的不便违背“开闭原则”。
五、总结
总之,简单工厂模式是最简单的工厂模式,但它违反了开闭原则和单一职责原则;工厂方法模式通过引入子类来解决问题,但当产品种类越来越多时,会增加系统的复杂度;抽象工厂模式通过将对象的创建和使用分离,提供了一个统一的接口来创建不同产品族的对象,它是所有工厂设计模式中最复杂的一种,但也是最强大和最灵活的一种。在实际应用中,可以根据具体的需求来选择合适的工厂模式。