定义:工厂模式是一种非常常用的创建型设计模式,其提供了创建对象的最佳方式。在创建对象时,不会对客户端暴露对象的创建逻辑,而是通过使用共同的接口来创建对象。

简单工厂模式

就是简单的将创建对象的过程交由工厂类来处理。逻辑比较简单,直接上代码。
如何吃鱼的抽象类

  1. public abstract class EatFish {
  2. public void buyFish(){
  3. System.out.println("买一条鱼。");
  4. }
  5. public void handlingFish(){
  6. System.out.println("处理鱼:杀鱼、去鱼鳞、去内脏");
  7. }
  8. public abstract void cookFish();
  9. public void eatfish(){
  10. System.out.println("开吃");
  11. }
  12. }

具体如何吃鱼

  1. /**
  2. * 鱼汤
  3. */
  4. public class FishSoup extends EatFish {
  5. @Override
  6. public void cookFish() {
  7. System.out.println("鱼汤");
  8. }
  9. }
  10. /**
  11. * 烤鱼
  12. */
  13. public class RoastFish extends EatFish{
  14. @Override
  15. public void cookFish() {
  16. System.out.println("烤鱼");
  17. }
  18. }
  19. /**
  20. * 清蒸鱼
  21. */
  22. public class SteamedFish extends EatFish{
  23. @Override
  24. public void cookFish() {
  25. System.out.println("清蒸");
  26. }
  27. }

工厂类创建具体的吃鱼类

  1. /**
  2. * 简单工厂模式:将创建对象的过程交给工厂,只需提供对应的类型
  3. */
  4. public class SimpleFactory {
  5. public EatFish createEatFish(String cookType) {
  6. EatFish eatFish = null;
  7. if ("steamed".equals(cookType)) {
  8. eatFish = new SteamedFish();
  9. } else if ("roast".equals(cookType)) {
  10. eatFish = new RoastFish();
  11. } else if ("soup".equals(cookType)) {
  12. eatFish = new FishSoup();
  13. }
  14. return eatFish;
  15. }
  16. }

吃鱼

  1. class PeopleEat {
  2. private SimpleFactory simpleFactory ;
  3. public PeopleEat(SimpleFactory simpleFactory){
  4. this.simpleFactory = simpleFactory;
  5. }
  6. public void eat(String cookType){
  7. EatFish eatFish = simpleFactory.createEatFish(cookType);
  8. eatFish.buyFish();
  9. eatFish.handlingFish();
  10. eatFish.cookFish();
  11. eatFish.eatfish();
  12. }
  13. }

工厂方法模式

其实就是在简单工厂的基础上,将创建对象的方法交由其子类去实现,细化其创建的对象。
抽象方法

  1. /**
  2. * 将创建对象的过程往后推,由子类进行创建
  3. * 比如:江西人喜欢烤鱼和清蒸鱼,湖南人喜欢烤鱼和鱼汤
  4. */
  5. public abstract class People {
  6. abstract EatFish createEatFish(String cookType);
  7. public void eat(String cookType){
  8. EatFish eatFish = createEatFish(cookType);
  9. eatFish.buyFish();
  10. eatFish.handlingFish();
  11. eatFish.cookFish();
  12. eatFish.eatfish();
  13. }
  14. }

具体哪里的人创建对应的对象

  1. /**
  2. * 江西人喜欢烤鱼和清蒸鱼
  3. */
  4. public class JiangXiPeople extends People {
  5. @Override
  6. EatFish createEatFish(String cookType) {
  7. EatFish eatFish = null ;
  8. if ("steamed".equals(cookType)) {
  9. eatFish = new SteamedFish();
  10. } else if ("roast".equals(cookType)) {
  11. eatFish = new RoastFish();
  12. }
  13. return eatFish;
  14. }
  15. public static void main(String[] args) {
  16. People people = new JiangXiPeople();
  17. people.eat("steamed");
  18. }
  19. }

抽象工厂模式

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂
举个例子:

有小米和华为两个品牌,都能生产手机和路由器。 这里就有两个维度了:1.小米和华为都有自己的工厂 2.工厂可以分为手机工厂和路由器工厂

类图如下:
image.png
创建手机工厂和路由器工厂的工厂

  1. //产品工厂接口
  2. public interface IProductFactory {
  3. //生产手机
  4. IPhoneProduct phoneProduct();
  5. //生成路由器
  6. IRouterProduct routerProduct();
  7. }

创建手机和路由器的工厂

  1. //手机产品接口
  2. interface IPhoneProduct {
  3. //开机
  4. void start();
  5. //关机
  6. void shutdown();
  7. //打电话
  8. void callup();
  9. //发邮件
  10. void sendSMS();
  11. }
  12. //路由器产品接口
  13. interface IRouterProduct {
  14. //开机
  15. void start();
  16. //关机
  17. void shutdown();
  18. //打开wifi
  19. void openwifi();
  20. //设置
  21. void setting();
  22. }

各自具体制作内容

  1. //华为手机实现类
  2. class HuaweiPhone implements IPhoneProduct {
  3. @Override
  4. public void start() {
  5. System.out.println("开启华为手机");
  6. }
  7. @Override
  8. public void shutdown() {
  9. System.out.println("关闭华为手机");
  10. }
  11. @Override
  12. public void callup() {
  13. System.out.println("华为手机打电话");
  14. }
  15. @Override
  16. public void sendSMS() {
  17. System.out.println("华为手机发邮件");
  18. }
  19. }
  20. //华为路由器实现类
  21. class HuaweiRouter implements IRouterProduct {
  22. @Override
  23. public void start() {
  24. System.out.println("开启华为路由器");
  25. }
  26. @Override
  27. public void shutdown() {
  28. System.out.println("关闭华为路由器");
  29. }
  30. @Override
  31. public void openwifi() {
  32. System.out.println("打开华为wifi");
  33. }
  34. @Override
  35. public void setting() {
  36. System.out.println("设置华为路由器");
  37. }
  38. }
  39. //小米手机实现类
  40. class XiaomiPhone implements IPhoneProduct {
  41. @Override
  42. public void start() {
  43. System.out.println("开启小米手机");
  44. }
  45. @Override
  46. public void shutdown() {
  47. System.out.println("关闭小米手机");
  48. }
  49. @Override
  50. public void callup() {
  51. System.out.println("小米手机打电话");
  52. }
  53. @Override
  54. public void sendSMS() {
  55. System.out.println("小米手机发邮件");
  56. }
  57. }
  58. //小米路由器实现类
  59. class XiaomiRouter implements IRouterProduct {
  60. @Override
  61. public void start() {
  62. System.out.println("开启小米路由器");
  63. }
  64. @Override
  65. public void shutdown() {
  66. System.out.println("关闭小米路由器");
  67. }
  68. @Override
  69. public void openwifi() {
  70. System.out.println("打开小米wifi");
  71. }
  72. @Override
  73. public void setting() {
  74. System.out.println("设置小米路由器");
  75. }
  76. }

创建各自的工厂

  1. //华为工厂实现类
  2. public class HuaweiFactory implements IProductFactory {
  3. @Override
  4. public IPhoneProduct phoneProduct() {
  5. return new HuaweiPhone();
  6. }
  7. @Override
  8. public IRouterProduct routerProduct() {
  9. return new HuaweiRouter();
  10. }
  11. }
  12. //小米工厂实现类
  13. class XiaomiFactory implements IProductFactory {
  14. @Override
  15. public IPhoneProduct phoneProduct() {
  16. return new XiaomiPhone();
  17. }
  18. @Override
  19. public IRouterProduct routerProduct() {
  20. return new XiaomiRouter();
  21. }
  22. }