经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式-抽象工厂模式
来源:cnblogs  作者:知识海洋中的浮萍  时间:2021/12/15 9:04:40  对本文有异议
抽象工厂可以在工厂方法模式上来理解
 
工厂方法模式是对简单工厂的进一步优化
首先,简单工厂模式内部的if或者case语句是不满足开放-封闭原则的
所以对简单工厂模式进一步优化,出现了工厂方法模式。
工厂方法模式将工厂抽象,实例化出不同的工厂,使得满足了开放-封闭原则
 
抽象工厂是在工厂方法模式上的又一部增强
工厂方法模式解决了同一类型物品实例化的问题,而抽象工厂解决了不同类型物品实例化的问题
 
按照工厂方法卖车的例子来说 client在需要汽车时,根据需要的型号找到对应的工厂来获取汽车。
不同类型的汽车都属于汽车类型。
此时如果又需要轮船了怎么办?
这时抽象工厂就出现了,相当于每个工厂既能生产汽车,又能生成轮船

 

 

 
那么之前工厂方法模式的例子中的工厂抽象类就要增加生成轮船的方法
  1. //定义工厂抽象类
  2. abstract class Factory{
  3. //能生产汽车
  4. public abstract Car getCar();
  5. //也能生产轮船
  6. public abstract Car getShip();
  7. }

 

增加轮船的抽象类

  1. //定义轮船的抽象类
  2. abstract class Ship{
  3. public abstract void getType();
  4. }

 

定义三种轮船

  1. //定义三种轮船
  2. class ShipA extends Ship{
  3. @Override
  4. public void getType() {
  5. System.out.println("A型号轮船");
  6. }
  7. }
  8. class ShipB extends Ship{
  9. @Override
  10. public void getType() {
  11. System.out.println("B型号轮船");
  12. }
  13. }
  14. class ShipC extends Ship{
  15. @Override
  16. public void getType() {
  17. System.out.println("C型号轮船");
  18. }
  19. }

 

三种工厂还要增加获取轮船的方法

  1. //定义三种工厂
  2. class FactoryA extends Factory{
  3. @Override
  4. public Car getCar() {
  5. return new CarA();
  6. }
  7. @Override
  8. public Car getShip() {
  9. return new ShipA();
  10. }
  11. }
  12. class FactoryB extends Factory{
  13. @Override
  14. public Car getCar() {
  15. return new CarB();
  16. }
  17. @Override
  18. public Car getShip() {
  19. return new ShipB();
  20. }
  21. }
  22. class FactoryC extends Factory{
  23. @Override
  24. public Car getCar() {
  25. return new CarC();
  26. }
  27. @Override
  28. public Car getShip() {
  29. return new ShipC();
  30. }
  31. }

 

测试

  1. public class AbstractFactoryTest {
  2. public static void main(String[] args) {
  3. //需要汽车
  4. Factory factoryB = new FactoryB();
  5. Car car = factoryB.getCar();
  6. car.getType();
  7. //需要轮船
  8. Factory factoryC = new FactoryC();
  9. Ship ship = factoryC.getShip();
  10. ship.getType();
  11. }
  12. }

 

在之前只需要生产汽车的时候,工厂方法模式就很好的解决了问题,
之后增加了需求,也需要轮船了,那么此时工厂既能生产汽车,也能生产轮船
就升级为抽象工厂模式,解决了不同族类型的问题

汽车是一个族,轮船是一个族,汽车和轮船不是同一个族

 

 
工厂方法解决了同族商品不同型号的问题
抽象工厂解决了不同族商品不同型号的问题

原文链接:http://www.cnblogs.com/randy123/p/15682133.html

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号