手写一个简单的工厂模式(一)

项目结构

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

完成项目后,只需修改applicationContext.properties文件里的值,就可以切换实现类。(例如从实现类UserServiceImpl,切换到UserServiceImplNew,只需按下图操作)

改变前的配置

改变前的输出

query User name = name password = suns
insert into user = User{name='suns', password='123456'}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

改变后的配置

改变后的输出

UserServiceImplNew.login
UserServiceImplNew.register

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

User
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package com.baizhiedu.basic;
 
public class User {
    private String name;
    private String password;
 
    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getPassword() {
        return password;
    }
 
    public void setPassword(String password) {
        this.password = password;
    }
 
    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

  

UserService
1
2
3
4
5
6
7
package com.baizhiedu.basic;
 
public interface UserService {
    public void register(User user);
 
    public void login(String name, String password);
}

  

1
UserServiceImpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package com.baizhiedu.basic;
 
public class UserServiceImpl implements UserService {
    private UserDAO userDAO = new UserDAOImpl();
    @Override
    public void register(User user) {
        userDAO.save(user);
    }
 
    @Override
    public void login(String name, String password) {
        userDAO.queryUserByNameAndPassword(name, password);
    }
}

  

UserDAO

1
2
3
4
5
6
7
package com.baizhiedu.basic;
 
public interface UserDAO {
    public void save(User user);
 
    public void queryUserByNameAndPassword(String name, String password);
}

  

UserDAOImpl

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.baizhiedu.basic;
 
public class UserDAOImpl implements UserDAO {
    @Override
    public void save(User user) {
        System.out.println("insert into user = " + user);
    }
 
    @Override
    public void queryUserByNameAndPassword(String name, String password) {
        System.out.println("query User name = " + name + " password = " + password);
    }
}

  

BeanFactory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package com.baizhiedu.basic;
 
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
 
public class BeanFactory {
    private static Properties env = new Properties();
 
    static {
        try {
            //第一步 获取IO输入流
            InputStream inputStream = BeanFactory.class.getResourceAsStream("/applicationContext.properties");
            //第二步 文件内容 封装 Properties集合中 key = userService , value = com.baizhixx.UserServiceImpl
            env.load(inputStream);
            //关流
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
 
    /**
     * 对象的创建方式:
     *    1.直接调用构造方法 创建对象 UserService userService = new UserServiceImpl();
     *    2.通过反射的形式 创建对象 解耦合
     *       Class clazz = Class.forName("com.baizhiedu.basic.UserServiceImpl");
     *       UserService userService = (UserService)clazz.newInstance();
     */
    public static UserService getUserService(){
//        return new UserServiceImpl();
 
 
        UserService userService = null;
        try {
            Class clazz = Class.forName(env.getProperty("userService"));
            //Object obj = clazz.newInstance();
            userService = (UserService)clazz.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return userService;
    }
}

  

UserServiceImplNew

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.baizhiedu.basic;
 
public class UserServiceImplNew implements UserService {
    @Override
    public void register(User user) {
        System.out.println("UserServiceImplNew.register");
    }
 
    @Override
    public void login(String name, String password) {
        System.out.println("UserServiceImplNew.login");
    }
}

  

TestSpring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.baizhiedu;
 
import com.baizhiedu.basic.BeanFactory;
import com.baizhiedu.basic.User;
import com.baizhiedu.basic.UserService;
import com.baizhiedu.basic.UserServiceImpl;
import org.junit.Test;
 
public class TestSpring {
    /**
     * 用于测试:工厂类进行解耦合的操作
     */
    @Test
    public void test1(){
        //UserServiceImplNew
 
        //UserService userService = new UserServiceImplNew();
//        UserService userService = new UserServiceImpl();
 
        UserService userService = BeanFactory.getUserService();
 
        userService.login("name", "suns");
 
        User user = new User("suns", "123456");
        userService.register(user);
    }
}

  

applicationContext.properties

第一种

1
userService = com.baizhiedu.basic.UserServiceImpl

  

第二种

1
userService = com.baizhiedu.basic.UserServiceImplNew

  

posted @   尐鱼儿  阅读(895)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示