三种工厂模式详解

发布于:2025-02-18 ⋅ 阅读:(110) ⋅ 点赞:(0)

1.简单工厂

1.目录结构

CleanShot 2025-02-02 at 10.57.49@2x

2.Fruit.java 水果接口
package com.sunxiansheng.design_pattern.factory.simple;

/**
 * Description: 水果接口
 *
 * @Author sun
 * @Create 2025/2/2 10:52
 * @Version 1.0
 */
public interface Fruit {

    void eat();
}
3.Apple.java 苹果
package com.sunxiansheng.design_pattern.factory.simple;

/**
 * Description: 苹果
 *
 * @Author sun
 * @Create 2025/2/2 10:52
 * @Version 1.0
 */
public class Apple implements Fruit {

    @Override
    public void eat() {
        System.out.println("吃苹果");
    }
}
4.Banana.java 香蕉
package com.sunxiansheng.design_pattern.factory.simple;

/**
 * Description: 香蕉
 *
 * @Author sun
 * @Create 2025/2/2 10:53
 * @Version 1.0
 */
public class Banana implements Fruit {

    @Override
    public void eat() {
        System.out.println("吃香蕉");
    }
}
5.FruitFactory.java 水果工厂根据类型来获取水果
package com.sunxiansheng.design_pattern.factory.simple;

/**
 * Description: 水果工厂
 *
 * @Author sun
 * @Create 2025/2/2 10:53
 * @Version 1.0
 */
public class FruitFactory {

    /**
     * 根据传入的类型,来获取不同的水果
     *
     * @param type
     * @return
     */
    public static Fruit getFruit(String type) {
        if (type.equalsIgnoreCase("apple")) {
            return new Apple();
        } else if (type.equalsIgnoreCase("banana")) {
            return new Banana();
        }
        return null;
    }
}
6.Client.java
package com.sunxiansheng.design_pattern.factory.simple;

/**
 * Description: 客户端
 *
 * @Author sun
 * @Create 2025/2/2 10:55
 * @Version 1.0
 */
public class Client {

    public static void main(String[] args) {
        Fruit apple = FruitFactory.getFruit("apple");
        apple.eat();
        Fruit banana = FruitFactory.getFruit("banana");
        banana.eat();
    }
}
7.小结

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

2.工厂方法

1.目录结构

CleanShot 2025-02-03 at 13.19.32@2x

2.IFactory.java 工厂接口
package com.sunxiansheng.design_pattern.factory.factorymethod.factory;

import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;

/**
 * Description: 工厂接口
 *
 * @Author sun
 * @Create 2025/2/3 12:49
 * @Version 1.0
 */
public interface IFactory {

    /**
     * 创建User表对象
     *
     * @return
     */
    IUser createUser();
}
3.MysqlFactory.java MySQL工厂
package com.sunxiansheng.design_pattern.factory.factorymethod.factory;

import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
import com.sunxiansheng.design_pattern.factory.factorymethod.user.MysqlUser;

/**
 * Description: MySQL工厂
 *
 * @Author sun
 * @Create 2025/2/3 12:50
 * @Version 1.0
 */
public class MysqlFactory implements IFactory {

    /**
     * 创建User表对象
     *
     * @return
     */
    @Override
    public IUser createUser() {
        return new MysqlUser();
    }
}
4.SqlserverFactory.java SQLServer工厂
package com.sunxiansheng.design_pattern.factory.factorymethod.factory;

import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
import com.sunxiansheng.design_pattern.factory.factorymethod.user.SqlserverUser;

/**
 * Description: SQLServer工厂
 *
 * @Author sun
 * @Create 2025/2/3 12:51
 * @Version 1.0
 */
public class SqlserverFactory implements IFactory {

    /**
     * 创建User表对象
     *
     * @return
     */
    @Override
    public IUser createUser() {
        return new SqlserverUser();
    }
}
5.IUser.java User表的接口
package com.sunxiansheng.design_pattern.factory.factorymethod.user;

/**
 * Description: User表的接口
 *
 * @Author sun
 * @Create 2025/2/3 12:50
 * @Version 1.0
 */
public interface IUser {

    /**
     * 新增用户
     *
     * @param user
     */
    void insert(User user);
}
6.User.java 用户表实体类
package com.sunxiansheng.design_pattern.factory.factorymethod.user;

/**
 * Description: 用户表实体类
 *
 * @Author sun
 * @Create 2024/9/3 20:45
 * @Version 1.0
 */
public class User {

    private int id;

    private String name;

    private int age;

    public User() {
    }

    public User(int id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
7.MysqlUser.java mysql用户表操作类
package com.sunxiansheng.design_pattern.factory.factorymethod.user;

/**
 * Description: mysql用户表操作类
 *
 * @Author sun
 * @Create 2024/9/3 20:47
 * @Version 1.0
 */
public class MysqlUser implements IUser {

    @Override
    public void insert(User user) {
        System.out.println("在mysql中插入一条用户数据");
    }
}
8.SqlserverUser.java sqlserver用户表操作类
package com.sunxiansheng.design_pattern.factory.factorymethod.user;

/**
 * Description: sqlserver用户表操作类
 *
 * @Author sun
 * @Create 2024/9/3 20:48
 * @Version 1.0
 */
public class SqlserverUser implements IUser {

    @Override
    public void insert(User user) {
        System.out.println("在sqlserver中插入一条用户数据");
    }
}
9.Client.java 客户端
package com.sunxiansheng.design_pattern.factory.factorymethod;

import com.sunxiansheng.design_pattern.factory.factorymethod.factory.IFactory;
import com.sunxiansheng.design_pattern.factory.factorymethod.factory.MysqlFactory;
import com.sunxiansheng.design_pattern.factory.factorymethod.factory.SqlserverFactory;
import com.sunxiansheng.design_pattern.factory.factorymethod.user.IUser;
import com.sunxiansheng.design_pattern.factory.factorymethod.user.User;

/**
 * Description: 客户端
 *
 * @Author sun
 * @Create 2025/2/3 13:01
 * @Version 1.0
 */
public class Client {

    public static void main(String[] args) {
        User user = new User();
        // 创建一个mysql工厂
        IFactory mysqlFactory = new MysqlFactory();
        // mysql工厂创建一个用户表操作类
        IUser mysqlUser = mysqlFactory.createUser();
        // 新增用户
        mysqlUser.insert(user);
        // 创建一个sqlserver工厂
        IFactory sqlserverFactory = new SqlserverFactory();
        // sqlserver工厂创建一个用户表操作类
        IUser sqlserverUser = sqlserverFactory.createUser();
        // 新增用户
        sqlserverUser.insert(user);
    }
}
10.小结

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

3.抽象工厂

1.目录结构

CleanShot 2025-02-08 at 10.47.49@2x

2.小结

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


网站公告

今日签到

点亮在社区的每一天
去签到