设计模式太难学?
前言
之前学习了工厂方法模式。发现其在简单工厂模式上做了些优化,从而使得你的工厂符合开闭原则、具有良好的扩展性。但是发现工厂方法模式对于一些复杂的产品创建,会增加类文件个数,加大系统开销。所以为了适应复杂产品的创建,引申出了另外一种工厂设计模式-抽象工厂模式
一、抽象工厂模式
抽象工厂模式的角色跟工厂方法模式的角色一致。分为:抽象工厂、工厂实现类、抽象产品、产品实现类、客户端
抽象工厂模式的提出是为了解决复杂产品的创建问题,它跟工厂方法模式的区别就是:工厂不再只创建单个产品、而是创建一族产品。其实这个一族产品就是上面说的复杂产品。
那么什么是一族产品? 举个例子:你做了一套后台管理系统,卖给客户。客户要求系统的ui必须有不同的风格设计,比如界面颜色、按钮尺寸、按钮颜色等。用户可根据自由搭配出想要的ui展示。这里用户自由选择的不同风格的按钮、颜色等信息生成的ui界面就属于一族产品。它们之间不属于同一产品线、但是又相互有联系(用户建立的)。
那么什么是复杂的产品? 举个例子:假如你开了一家服装厂、你们主打的是业务是卖成套的校服。也就是说你必须完整且统一对外提供一套又一套的校服。这里的校服就是复杂的产品
本文,我们拿校服例子来理解:先简单的将一套校服分解成:上衣、裤子 两个部分
先来看这种情况下,如果使用工厂方法模式去设计代码,会怎么样:工厂方法模式下,想要对外提供一套完整的校服,那么就得创建两个工厂,一个工厂生产上衣、一个工厂生产裤子。然后再将它们组合起来对外出售。可是本来你的想法是只开一家工厂,现在却需要开两家工厂才能完成,这样就增加了你的管理运营成本。
下面看抽象工厂模式是怎么处理的:你需要一套校服是吧,可是我现在只有一个上衣生产工厂,没有裤子怎么办?我直接在我上衣工厂里增加一条流水线,专门生产裤子。这样就能正常成套对外售卖。
是的,抽象工厂模式就是这么简单粗暴,虽然这么做很有效的解决了我想要成套售卖校服的需求,但是这样却不符合开闭原则,假如我下次还想连鞋子跟衣服裤子一起成套卖,这样我就又得在我原有工厂里增加一条生产鞋子的流水线,这样下去我的工厂职责越来越不单一。当我的产品族里需要组合的产品多了后,我工厂里的业务也会越来越复杂。
二、代码演示
上面说抽象工厂和工厂方法模式的区别就是创建产品的不同,抽象工厂模式是创建一族产品,工厂方法模式是创建一种产品,对应到代码区别,其实就是抽象工厂模式下工厂类的实现方法比工厂方法模式多。
现在我们直接通过代码来演示下抽象工厂模式的示例。
抽象工厂模式
1、先创建抽象产品以及具体产品实现角色
package com.example.study.factory;
public interface Product {
void make();
}
//上衣产品
package com.example.study.factory;
public class JacketProduct implements Product{
@Override
public void make() {
System.out.println("生产一件上衣");
}
}
//短裤产品
package com.example.study.factory;
public class ShortsProduct implements Product{
@Override
public void make() {
System.out.println("生产一条短裤");
}
}
创建抽象工厂角色,并声明该工厂需要生产那些产品
package com.example.study.factory;
public interface ClothesFactory {
//生产上衣的流水线
Product createJacket();
//生产短裤的流水线
Product createShorts();
//提供完整的衣服
void createClothes();
}
创建具体的工厂实现角色(只需要一个工厂实现类)
package com.example.study.factory;
public class ClothesFactoryImpl implements ClothesFactory{
@Override
public Product createJacket() {
return new JacketProduct();
}
@Override
public Product createShorts() {
return new ShortsProduct();
}
@Override
public void createClothes() {
createJacket().make();
createShorts().make();
System.out.println("一套校服生产完成");
}
}
接下来创建客户端角色来验证
package com.example.study.factory;
public class Client {
public static void main(String[] args) {
ClothesFactory clothesFactory = new ClothesFactoryImpl();
clothesFactory.createClothes();
}
}
工厂方法模式
如果用工厂方法模式来实现上诉需求的话,会比抽象工厂模式多增加一个类。需要创建两个工厂实现类,一个专门生产上衣、一个专门生产短裤。然后再组装。具体代码实现可参考上篇文章工厂方法模式
总结
抽象工厂方法:能创建复杂维度的产品,但是不符合开闭原则可扩展性差。适用于特定场景
工厂方法模式:符合开闭原则,但在复杂维度的产品组合下,会大大增加类文件个数,增加系统开销。适用于特定场景下
任何技术都没有百分百的完美,使用任何技术都得要个取舍,设计模式也不例外。使用工厂方法模式就得忍受类文件大量增加,使用抽象工厂模式就得忍受扩展性差问题。我们只能在适合的场景使用适合的设计模式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99035.html