设计模式之工厂方法

上篇我们提到了为了更好地解耦,我们引入了简单工厂设计模式。

但是简单工厂模式还存在问题,就是一个工厂不是万能的,我们不能要求一个工厂既生产这个,又生产那个。

为解决这个问题,我们来学习一下工厂方法设计模式。

简单地说,工厂方法就是把生产不同品牌的工厂分离开来,一个工厂专注于生产一个品牌,生活化些,就是我们不能要求一个鞋厂既生产耐克,又生产阿迪达斯,耐克和阿迪达斯应该是两个分开的工厂。

好的,下面我们来写代码:

还是上次我们用的面包的例子,我们首先看一下面包类的代码:

public interface Bread {
    void eat();
}
//此处的DanXiang为面包品牌
public class DanXiangBread implements Bread {
    @Override
    public void eat() {
        System.out.println("我在吃丹香面包");
    }
}
//此处的桃李为面包品牌
public class TaoLiBread implements Bread{
    @Override
    public void eat() {
        System.out.println("我在吃桃李面包");
    }
}

然后开始写工厂类,此处于简单工厂不同的是,简单工厂只有一个工厂,这个简单工厂既生产桃李面包,又生产丹香面包。而此处将生产桃李面包的工厂和生产丹香面包的工厂分离开来,这就使桃李工厂专注于生产桃李面包,丹香工厂专注于生产丹香面包,下面来看代码:

工厂接口:

public interface Factory {
    Bread makeBread();
}

桃李面包工厂:

public class TaoLiBreadFactory implements Factory {
    @Override
    public Bread makeBread() {
        return new TaoLiBread();
    }
}

丹香面包工厂:

public class DanXiangBreadFactory implements Factory {
    @Override
    public Bread makeBread() {
        return new DanXiangBread();
    }
}

好了,我们来写一个测试类测试一下:

public class Test {
    public static void main(String[] args) {
        Factory taoLiBreadFactory = new TaoLiBreadFactory();
        Bread bread = taoLiBreadFactory.makeBread();
        bread.eat();
    }
}

我们可以看到,工厂方法设计模式将生产不同品牌面包的工厂分离开来,这样可以使一个工厂专注于一个品牌的特色,代码层面说,代码可以更好地解耦。

但是,工厂方法也有他的不足之处,我们来仔细看一下测试类的代码:

我们可以看到,我们为了得到桃李面包,首先要new一个TaoLiBreadFactory的实例。反映在现实生活中就是,消费者为了吃一个桃李面包,首先要到桃李面包厂去;想要吃一个丹香面包,又要到丹香面包厂去。显然这是不合理的。反映到代码中就是,客户端程序员要得到一个实例,首先要new一个生产该实例的方法,这无疑增加了客户端程序员代码的复杂度。

为了解决这个问题,抽象工厂设计模式产生了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值