zoukankan      html  css  js  c++  java
  • <十一>读<<大话设计模式>>之抽象工厂模式


             学习设计模式有一段时间了,对设计模式有一个体会,就是没那么难。就是设计程序遵循一些原则,让代码可复用,在改动的时候不用涉及太多的类,扩展方便。抽象工厂模式名字听起来抽象。但理解起来一点也不抽象,用语言可能不好理解。我喜欢通过代码理解。然后成为自己的东西。

    抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们详细的类。

             <<大话设计模式>>以项目上线时想换另外一个数据库为样例展开的,假如我没原来用的是SqlServer,如今换成access,代码例如以下:

    1、訪问数据库工厂

    /**

     * @author jzhf 

     * 2014-11-03

     * 创建一个訪问user的工厂接口

     */

    public interface IFactory {

     

       IUser createUser();

       IDepartment createDepartment();

    }

    IUser指的是对用户表的操作,IDepartment指的是对部门表的操作,关于这两个类在以下有介绍。

    2、SqlServer数据库工厂类操作

    public class SqlServerFactory implements IFactory {

     

       /* (non-Javadoc)

        * @seecom.test.model.abstractFactory.IFactory#createUser()

        */

       public IUser createUser() {

          // TODO Auto-generatedmethod stub

          return new SqlServerUser();

       }

     

       /* (non-Javadoc)

        * @seecom.test.model.abstractFactory.IFactory#createDepartment()

        */

       public IDepartment createDepartment() {

          // TODO Auto-generatedmethod stub

          return new SqlServerDepartment();

       }

     

    }

    3、详细类,对user操作

    /**

     * @author jzhf 

     * 2014-10-31

     */

    public class SqlServerUser implements IUser {

     

       /* (non-Javadoc)

        * @seecom.test.model.abstractFactory.IUser#getUser(int)

        */

       public void getUser(int id) {

          // TODO Auto-generatedmethod stub

     

          System.out.println("sqlserverget User by Id");

       }

     

       /* (non-Javadoc)

        * @seecom.test.model.abstractFactory.IUser#insert(com.test.model.abstractFactory.User)

        */

       public void insert(User user) {

          // TODO Auto-generatedmethod stub

     

          System.out.println("sqlserverinsert user");

       }

     

    }

    4、用户接口

    public interface IUser {

     

       void insert(User user);

       void getUser(int id);

    }

    5、部门类与用户代码差点儿相同。略。access数据库代码与SqlServer数据库代码一致,略

    6、client

    public class UserClient {

     

       /**

        * @param args

        */

       public static void main(String[] args) {

          // TODO Auto-generatedmethod stub

     

          IFactory factory = new SqlServerFactory();

          IUser iUser = factory.createUser();

          User user = new User();

          user.setId(0);

          user.setName("小王");

          iUser.insert(user);

          iUser.getUser(0);

         

          IFactory factory2 = new AccessFactory();

          IUser iUser2 = factory2.createUser();

          iUser2.insert(user);

          iUser2.getUser(0);

         

         

          //-----------添加部门接口之后-----------

          IDepartment iDepartment = factory.createDepartment();

          //然后改动insert传入的值

       }

     

    }

            从代码和以下的图标能够看到,IFactory是抽象工厂接口。它里面包括全部的产品创建的抽象方法,而SqlServerFactory和accessFactory就是详细的工厂,这个详细的工厂然后创建具有特定实现的产品对象。也就是说,为创建不同的产品对象。client应使用不同的详细工厂。

    抽象工厂优缺点

             长处:易于交换产品系列,因为详细工厂类,在一个应用中仅仅须要在初始化的时候出现一次,这就使得改变一个应用的详细工厂变得很easy,它仅仅须要改变详细工厂就可以使用不同的产品配置。第二个长处是它让详细的创建实例过程与client分离,client是通过它们的抽象接口操纵实例。产品的详细类名也被详细工厂的实现分离,不会出如今client代码中。

    遵循了开放-封闭原则和依赖倒转原则。

    缺点也是有的假设我要添加功能,则须要增家三个类。抽象工厂类。工厂详细类和详细实现类。还须要更改原抽象工厂才干够全然实现,很麻烦。

    最后附上结构图:

     

  • 相关阅读:
    Google
    LeetCode 664. 奇怪的打印机
    LeetCode 79. 单词搜索
    LeetCode 224. 基本计算器
    Windows 端口映射
    LeetCode 354. 俄罗斯套娃信封问题
    LeetCode 300. 最长递增子序列
    LeetCode 338. 比特位计数
    LeetCode 395. 至少有K个重复的最长子串
    LeetCode 424. 替换后的最长重复字符
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5360897.html
Copyright © 2011-2022 走看看