本文主要是介绍白话文学习设计模式 - 抽象工厂,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
抽象工厂
- 定义 :抽象工厂模式提供了一个创建一系列相关/相互依赖对象的接口
- 无须制定他们具体类
- 类型:创建型
应用场景
- 客户端不依赖于产品类实例如何被创建,实现等细节
- 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量的重复代码
- 提供一个产品类的库,所有的产品以同样的接口出现从而是客户端不依赖于具体的实现
产品族和产品等级
- 如下图所示
抽象工厂和工厂方法
- 了解了上述的产品族和产品等级之后我们再看抽象工厂和工厂方法的区别
- 我们通过 设计模式 - 工厂方法 。了解到只是针对一个产品等级而言的。
- 而抽象工厂是解决一个产品族的问题。
优点
- 具体的产品在应用层代码隔离,无须关系创建细节
- 将一个系列的产品族统一到一起创建
缺点
- 规定了所有可能被创建的产品集合,如果在产品族中扩展新的产品比较困难需要修改抽象工厂的相关接口
- 增加了系统的抽象性和理解难度
角色
- 产品族工厂
- 产品族具体实现类 (海尔产品族 美的产品族)
- 产品抽象类(冰箱,洗衣机等)
- 产品具体实现类
Coding
- 定义产品族,目前一个产品族两个产品 电脑 和显示器
public abstract class CourseFactory {/*** 获取电脑** @return Computer*/abstract Computer getComputer();/*** 获取显示器** @return Monitor*/abstract Monitor getMonitor();}
- 具体产品的抽象类
public class LenovoCourseFactory extends CourseFactory{@OverrideComputer getComputer() {return new LenovoComputer();}@OverrideMonitor getMonitor() {return new LenovoMonitor();}
}
public class AppleCourseFactory extends CourseFactory{@OverrideComputer getComputer() {return new AppleComputer();}@OverrideMonitor getMonitor() {return new AppleMonitor();}
}
- 定义具体产品的实现类
public class AppleComputer implements Computer {public void produce() {System.out.println("苹果电脑");}
}
public class LenovoMonitor implements Monitor{public void produce() {System.out.println("联想显示器");}
}
- 定义具体的产品
public interface Monitor {/*** 生产显示器*/void produce();
}
public interface Computer {/*** 生产电脑*/void produce();
}
- 测试类
public class AbstractFactoryTest {public static void main(String[] args) {CourseFactory appleCourseFactory = new AppleCourseFactory();Computer appleComputer = appleCourseFactory.getComputer();Monitor appleMonitor = appleCourseFactory.getMonitor();appleComputer.produce();appleMonitor.produce();CourseFactory lenovoCourseFactory = new LenovoCourseFactory();Computer lenovoComputer = lenovoCourseFactory.getComputer();Monitor lenovoMonitor = lenovoCourseFactory.getMonitor();lenovoComputer.produce();lenovoMonitor.produce();}
}
UML图
- 从图中可以看出
- 我们的测试类(Client)只需要依赖具体的AppleCourseFactory 和 LenovoCourseFactory 不需要依赖具体的实现
- 我们在使用的过程中,提前定义好产品族的产品,后续如果有修改还是比较麻烦
- 我们在新增产品族的时候,不需要改动其他的代码。
- 如果文章有帮助到你欢迎关注微信公众号《后端学长》
这篇关于白话文学习设计模式 - 抽象工厂的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!