IT评测·应用市场-qidao123.com

标题: 三种工厂模式详解 [打印本页]

作者: 万万哇    时间: 2025-2-18 04:23
标题: 三种工厂模式详解
1.简单工厂

1.目录布局


2.Fruit.java 水果接口

  1. package com.sunxiansheng.design_pattern.factory.simple;
  2. /**
  3. * Description: 水果接口
  4. *
  5. * @Author sun
  6. * @Create 2025/2/2 10:52
  7. * @Version 1.0
  8. */
  9. public interface Fruit {
  10.     void eat();
  11. }
复制代码
3.Apple.java 苹果

  1. package com.sunxiansheng.design_pattern.factory.simple;
  2. /**
  3. * Description: 苹果
  4. *
  5. * @Author sun
  6. * @Create 2025/2/2 10:52
  7. * @Version 1.0
  8. */
  9. public class Apple implements Fruit {
  10.     @Override
  11.     public void eat() {
  12.         System.out.println("吃苹果");
  13.     }
  14. }
复制代码
4.Banana.java 香蕉

  1. package com.sunxiansheng.design_pattern.factory.simple;
  2. /**
  3. * Description: 香蕉
  4. *
  5. * @Author sun
  6. * @Create 2025/2/2 10:53
  7. * @Version 1.0
  8. */
  9. public class Banana implements Fruit {
  10.     @Override
  11.     public void eat() {
  12.         System.out.println("吃香蕉");
  13.     }
  14. }
复制代码
5.FruitFactory.java 水果工厂根据类型来获取水果

  1. package com.sunxiansheng.design_pattern.factory.simple;
  2. /**
  3. * Description: 水果工厂
  4. *
  5. * @Author sun
  6. * @Create 2025/2/2 10:53
  7. * @Version 1.0
  8. */
  9. public class FruitFactory {
  10.     /**
  11.      * 根据传入的类型,来获取不同的水果
  12.      *
  13.      * @param type
  14.      * @return
  15.      */
  16.     public static Fruit getFruit(String type) {
  17.         if (type.equalsIgnoreCase("apple")) {
  18.             return new Apple();
  19.         } else if (type.equalsIgnoreCase("banana")) {
  20.             return new Banana();
  21.         }
  22.         return null;
  23.     }
  24. }
复制代码
6.Client.java

  1. package com.sunxiansheng.design_pattern.factory.simple;
  2. /**
  3. * Description: 客户端
  4. *
  5. * @Author sun
  6. * @Create 2025/2/2 10:55
  7. * @Version 1.0
  8. */
  9. public class Client {
  10.     public static void main(String[] args) {
  11.         Fruit apple = FruitFactory.getFruit("apple");
  12.         apple.eat();
  13.         Fruit banana = FruitFactory.getFruit("banana");
  14.         banana.eat();
  15.     }
  16. }
复制代码
7.小结

简单工厂就是很直接的根据传入的类型去返回不同的对象而已
2.工厂方法

1.目录布局


2.IFactory.java 工厂接口

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.factory;
  2. import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
  3. /**
  4. * Description: 工厂接口
  5. *
  6. * @Author sun
  7. * @Create 2025/2/3 12:49
  8. * @Version 1.0
  9. */
  10. public interface IFactory {
  11.     /**
  12.      * 创建User表对象
  13.      *
  14.      * @return
  15.      */
  16.     IUser createUser();
  17. }
复制代码
3.MysqlFactory.java MySQL工厂

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.factory;
  2. import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
  3. import com.sunxiansheng.design_pattern.factory.factorymethod.user.MysqlUser;
  4. /**
  5. * Description: MySQL工厂
  6. *
  7. * @Author sun
  8. * @Create 2025/2/3 12:50
  9. * @Version 1.0
  10. */
  11. public class MysqlFactory implements IFactory {
  12.     /**
  13.      * 创建User表对象
  14.      *
  15.      * @return
  16.      */
  17.     @Override
  18.     public IUser createUser() {
  19.         return new MysqlUser();
  20.     }
  21. }
复制代码
4.SqlserverFactory.java SQLServer工厂

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.factory;
  2. import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
  3. import com.sunxiansheng.design_pattern.factory.factorymethod.user.SqlserverUser;
  4. /**
  5. * Description: SQLServer工厂
  6. *
  7. * @Author sun
  8. * @Create 2025/2/3 12:51
  9. * @Version 1.0
  10. */
  11. public class SqlserverFactory implements IFactory {
  12.     /**
  13.      * 创建User表对象
  14.      *
  15.      * @return
  16.      */
  17.     @Override
  18.     public IUser createUser() {
  19.         return new SqlserverUser();
  20.     }
  21. }
复制代码
5.IUser.java User表的接口

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.user;
  2. /**
  3. * Description: User表的接口
  4. *
  5. * @Author sun
  6. * @Create 2025/2/3 12:50
  7. * @Version 1.0
  8. */
  9. public interface IUser {
  10.     /**
  11.      * 新增用户
  12.      *
  13.      * @param user
  14.      */
  15.     void insert(User user);
  16. }
复制代码
6.User.java 用户表实体类

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.user;
  2. /**
  3. * Description: 用户表实体类
  4. *
  5. * @Author sun
  6. * @Create 2024/9/3 20:45
  7. * @Version 1.0
  8. */
  9. public class User {
  10.     private int id;
  11.     private String name;
  12.     private int age;
  13.     public User() {
  14.     }
  15.     public User(int id, String name, int age) {
  16.         this.id = id;
  17.         this.name = name;
  18.         this.age = age;
  19.     }
  20.     public int getId() {
  21.         return id;
  22.     }
  23.     public void setId(int id) {
  24.         this.id = id;
  25.     }
  26.     public String getName() {
  27.         return name;
  28.     }
  29.     public void setName(String name) {
  30.         this.name = name;
  31.     }
  32.     public int getAge() {
  33.         return age;
  34.     }
  35.     public void setAge(int age) {
  36.         this.age = age;
  37.     }
  38.     @Override
  39.     public String toString() {
  40.         return "User{" +
  41.                 "id=" + id +
  42.                 ", name='" + name + '\'' +
  43.                 ", age=" + age +
  44.                 '}';
  45.     }
  46. }
复制代码
7.MysqlUser.java mysql用户表操作类

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.user;
  2. /**
  3. * Description: mysql用户表操作类
  4. *
  5. * @Author sun
  6. * @Create 2024/9/3 20:47
  7. * @Version 1.0
  8. */
  9. public class MysqlUser implements IUser {
  10.     @Override
  11.     public void insert(User user) {
  12.         System.out.println("在mysql中插入一条用户数据");
  13.     }
  14. }
复制代码
8.SqlserverUser.java sqlserver用户表操作类

  1. package com.sunxiansheng.design_pattern.factory.factorymethod.user;
  2. /**
  3. * Description: sqlserver用户表操作类
  4. *
  5. * @Author sun
  6. * @Create 2024/9/3 20:48
  7. * @Version 1.0
  8. */
  9. public class SqlserverUser implements IUser {
  10.     @Override
  11.     public void insert(User user) {
  12.         System.out.println("在sqlserver中插入一条用户数据");
  13.     }
  14. }
复制代码
9.Client.java 客户端

  1. package com.sunxiansheng.design_pattern.factory.factorymethod;
  2. import com.sunxiansheng.design_pattern.factory.factorymethod.factory.IFactory;
  3. import com.sunxiansheng.design_pattern.factory.factorymethod.factory.MysqlFactory;
  4. import com.sunxiansheng.design_pattern.factory.factorymethod.factory.SqlserverFactory;
  5. import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
  6. import com.sunxiansheng.design_pattern.factory.factorymethod.user.User;
  7. /**
  8. * Description: 客户端
  9. *
  10. * @Author sun
  11. * @Create 2025/2/3 13:01
  12. * @Version 1.0
  13. */
  14. public class Client {
  15.     public static void main(String[] args) {
  16.         User user = new User();
  17.         // 创建一个mysql工厂
  18.         IFactory mysqlFactory = new MysqlFactory();
  19.         // mysql工厂创建一个用户表操作类
  20.         IUser mysqlUser = mysqlFactory.createUser();
  21.         // 新增用户
  22.         mysqlUser.insert(user);
  23.         // 创建一个sqlserver工厂
  24.         IFactory sqlserverFactory = new SqlserverFactory();
  25.         // sqlserver工厂创建一个用户表操作类
  26.         IUser sqlserverUser = sqlserverFactory.createUser();
  27.         // 新增用户
  28.         sqlserverUser.insert(user);
  29.     }
  30. }
复制代码
10.小结

工厂方法的核心就是一个工厂只负责创建一个对象。好比, MySQL和SQLServer对User表的SQL操作是不同的,所以就筹划一个 MySQL工厂和一个SQLServer工厂,然后目的就是创建各自的操作User表的对象。现在可以开始造对象了,起首需要一个IUser接口,然后就是MysqlUser对象和SqlserverUser对象。末了不同的工厂,返回对应的对象即可
3.抽象工厂

1.目录布局


2.小结

其实抽象工厂就是数据库工厂从创建一个表的CRUD酿成了创建多个表的CRUD。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4