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代码中。

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

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

    最后附上结构图:

     

  • 相关阅读:
    古谚、评论与论断、名篇与名言
    重读《西游记》
    重读《西游记》
    命名之法 —— 时间、季节、地点
    命名之法 —— 时间、季节、地点
    文言的理解 —— 古时的称谓、别称、别名
    文言的理解 —— 古时的称谓、别称、别名
    Oracle GoldenGate for Oracle 11g to PostgreSQL 9.2.4 Configuration
    瀑布 敏捷 文档
    POJ 1325 ZOJ 1364 最小覆盖点集
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5360897.html
Copyright © 2011-2022 走看看