简单工厂模式

情到浓时终转凉″ 提交于 2019-12-20 00:13:26

      自己学习的过程中,简单记录一下,忘记了也能 很快回想起来。教科书是刘伟 编写的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这两个实现,字面意思也不难理解。                

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!