自己学习的过程中,简单记录一下,忘记了也能 很快回想起来。教科书是刘伟 编写的Java设计模式,因为 大学学习该门课程的时候,也是使用该作者编写的《设计模式》一书,所以感觉上比较熟悉。所写的博客仅为个人理解,并不代表书中作者思想,若有不对,望指正。
public class UserDao {
public void findUserById(){
System.out.println("Base UserDao");
}
}
public class JDBCUserDao extends UserDao {
@Override
public void findUserById() {
System.out.println("JDBCUserDao");
}
}
public class HibernateUserDao extends UserDao {
@Override
public void findUserById() {
System.out.println("HibernateUserDao");
}
}
public class UserDaoFactory {
public static UserDao createUserDao(int arg){
if(arg==0){
return new JDBCUserDao();
}else {
return new HibernateUserDao();
}
}
}
上面代码是《创建对象与使用对象——谈谈工厂的作用》一文中类图的简单实现,便于阅读文章时理解。其中UserDao是基类,而JDBCUserDao和HibernateUserDao是其子类,表示两种不同的实现。UserDaoFacotry是工厂类,其功能是根据传入参数的不同, 创建不同的实现。这样做的好处,用文中的话描述就是:如果UserDAO的某个子类的构造函数发生改变或者要需要添加或移除不同的子类,只要维护UserDAOFactory的代码,而不会影响到LoginAction;如果UserDAO的接口发生改变,例如添加、移除方法或改变方法名,只需要修改LoginAction,不会给UserDAOFactory带来任何影响。那么除了这些,使用简单工厂模式还能带来的功能是区分构造方法。例如:
public class Rectangle {
public Rectangle(int width, int height){
System.out.println("使用两个参数"+width+""+height);
}
public Rectangle(int width){
System.out.println("使用一个参数"+width);
}
}
public class RectangleFactory {
public Rectangle createRectangle(int width, int height){
return new Rectangle(width,height);
}
public Rectangle createSquare(int width){
return new Rectangle(width);
}
}
Java中每个类可以拥有多个构造函数,构造函数和类名相同,在使用仅能通过传入参数的不同来区分,通过使用简单工厂的封装,使得在使用构造函数是,能通过命名明确区分,一目了然。
在简单工厂中存在几个概念,分别是:工厂角色(Factory)、抽象产品角色(Product)、具体产品角色(ConncreteProduct)。对应于第一处的代码来说,工厂角色就是UserDaoFactory,抽象产品角色就是UserDao,而具体产品角色就是JDBCUserDao和HibernateUserDao这两个实现,字面意思也不难理解。
来源:CSDN
作者:leizhou9817
链接:https://blog.csdn.net/leizhou9817/article/details/103620516