<十一>读<<大话设计模式>>之抽象工厂模式


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

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

         <<大话设计模式>>以项目上线时想换另外一个数据库为例子展开的,假如我没原来用的是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、客户端

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就是具体的工厂,这个具体的工厂然后创建具有特定实现的产品对象,也就是说,为创建不同的产品对象,客户端应使用不同的具体工厂。

抽象工厂优缺点

         优点:易于交换产品系列,由于具体工厂类,在一个应用中只需要在初始化的时候出现一次,这就使得改变一个应用的具体工厂变得非常容易,它只需要改变具体工厂即可使用不同的产品配置。第二个优点是它让具体的创建实例过程与客户端分离,客户端是通过它们的抽象接口操纵实例,产品的具体类名也被具体工厂的实现分离,不会出现在客户端代码中。遵循了开放-封闭原则和依赖倒转原则。

缺点也是有的如果我要增加功能,则需要增家三个类,抽象工厂类,工厂具体类和具体实现类,还需要更改原抽象工厂才可以完全实现,非常麻烦。

最后附上结构图:

 

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值