`
kang
  • 浏览: 464226 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

创建模式之工厂模式factory

阅读更多

工厂模式的主要应用场合:


模块间调用时模块可选择的接口很多(可根据不同的情况进行不同的选择,程序的可扩充性比较强);

或者实例化一个对象时需要进行比较复杂的操作(不仅仅是普通的new一下,可能有准备或者收尾工作等)。

 

 

工厂模式的优缺点:


优点:客户类和工厂类分开。客户类任何时候需要某种产品,只需向工厂请求即可。客户类无须修改就可以接纳新产品。
缺点:当产品修改时,工厂类也要做相应的修改。如:产品如何创建及如何向客户端提供。

 

 

举例(摘自网络):

 

追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory。

 

<!----><!----> <!---->

 

1.没有使用工厂模式:

 

package com.javaeye.kang.factory;

 

/**

  * 传统 的做法

  * 不使用工厂模式

  * 直接在 Action new CustomerDao 象,耦合度高,可 充性低

  */

 

class Action {

      public void callDao() {

            CustomerDao customerDao = new CustomerDao();

            customerDao.login();

      }

}

 

class CustomerDao {

      public void login() {

            System. out .println( " " );

      }

}

 

public class FactoryTest {

 

      public static void main(String[] args) {

            Action action = new Action();

            action.callDao();

      }

}

 

测试结果:

 


2.使用工厂模式:

package com.javaeye.kang.factory;

 

/**

  * 使用工厂模式

  * 1. 面向接口

  * 2. 建立工厂

  */

 

class Action {

      public void callDao() {

          // 将字符串 CustomerDao dao 工厂,然后从中拿到 CustomerDao

          // 也可以根据情况 其他 dao 工厂中去,然后从中拿到其他的 对应对

          ICustomerDao iCustomerDao = DaoFactory.getDao ( "CustomerDao" );

          iCustomerDao.login();

      }

}

 

//dao 工厂

class DaoFactory {

      public static ICustomerDao getDao(String daoDame) {

            if ( "CustomerDao" .endsWith(daoDame)) {

                  // 先准 工作

                  return new CustomerDao();

            } else if ( ... ) {

                  Return ...

            }

            return null ;

      }

}

 

// 接口

interface ICustomerDao {

      public abstract void login();

}

 

// 实现 接口的具体

class CustomerDao implements ICustomerDao{

      public void login() {

            System. out .println( " " );

      }

}

 

public class FactoryTest {

 

      public static void main(String[] args) {

            Action action = new Action();

            action.callDao();

      }

}

 

 

 

3.对上一个工厂模式进行改进:

package com.javaeye.kang.factory;

 

/**

  * 上一个工厂模式 行改

  * 1. 大服 务对 象,将 ICustomerDao Object

  * 2. 利用 的反射机制

  */

 

class Action {

      public void callDao() {

          // 将字符串 CustomerDao dao 工厂,然后从中拿到 CustomerDao

            // 也可以根据情况 其他 dao 工厂中去,然后从中拿到其他的 对应对

            // 转换 (从 Object ICustomerDao

            ICustomerDao iCustomerDao = (ICustomerDao) DaoFactory.getDao ( "CustomerDao" );

            iCustomerDao.login();

      }

}

 

//dao 工厂

class DaoFactory {

      public static Object getDao(String daoDame) {

            // 先的准 工作

  // 从配置文件中 daoDame 对应 名。如果切 ,修改配置文件中 对应 名就可以了

            String className = ;

            // 利用 的反射机制

            return Class.forName(className).getInterfaces();

      }

}

// 配置文件,再 展下去就是 spring 了(通 配置文件将 象注入到程序中)

 

 

// 接口

interface ICustomerDao {

      public abstract void login();

}

 

// 实现 接口的具体

class CustomerDao implements ICustomerDao{

      public void login() {

            System. out .println( " " );

      }

}

 

public class FactoryTest {

 

      public static void main(String[] args) {

            Action action = new Action();

            action.callDao();

      }

 

  • 描述: 工厂模式
  • 大小: 95.3 KB
  • 描述: 工厂模式要点
  • 大小: 79.3 KB
  • 描述: 工厂模式小结
  • 大小: 131 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics