设计模式(2) -- 工厂模式

     工厂模式代码模型

     step1: 构造 抽象的业务逻辑接口

public interface Operaction{
    
    public void turnOn();
    
    public void turnOff();

}

     step2: 具体的实现类一

public class OneOperaction implements Operaction {

    public void turnOn() {
       System.out.println("OneOperaction turnOn");        
    }

    public void turnOff() {
        System.out.println("OneOperaction turnOff");
    }

}

     step3: 具体的实现类二

public class TwoOperaction implements Operaction {

    public void turnOn() {
       System.out.println("TwoOperaction turnOn");        
    }

    public void turnOff() {
        System.out.println("TwoOperaction turnOff");
    }

}

      step4: 创建工厂类和实现类

public interface OperactionFactory {
    
    public Operaction createOperaction();

}
public class OneOperactionFactory implements OperactionFactory {

    @Override
    public Operaction createOperaction() {
        return new OneOperaction();
    }

}
public class TwoOperactionFactory implements OperactionFactory {

    @Override
    public Operaction createOperaction() {
        return new TwoOperaction();
    }

}

       step5: 测试:

public class Test {
    
    public static void main(String[] args) {
        OperactionFactory operactionFactory = new OneOperactionFactory();
        Operaction oneOperaction =  operactionFactory.createOperaction();
        oneOperaction.turnOff();
        oneOperaction.turnOn();
        
        Operaction twoOperaction =  operactionFactory.createOperaction();
        twoOperaction.turnOff();
        twoOperaction.turnOn();。
} }

------>>------
OneOperaction turnOff
OneOperaction turnOn
OneOperaction turnOff
OneOperaction turnOn
------>>------

 

     简单工厂模式和工厂模式的区别:

     简单工厂模式的最大优点在于工厂类中包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说。去除了与具体产品的依赖。

     比如设计一个简单的计算器客户端,只需要客户端传递"+"给工厂,工厂自动生成相应的实例,不同的实例产生不同的运算。

     但是如果我们需要添加新的方法的话,就需要在工厂类中的添加一个分支"case"。这其实就违背了"开放--关闭原则"。

     ------》》》工厂模式就是解决这类问题的:

           工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。

           既然这个工厂类与分支耦合,那我们根据依赖倒转原则,把工厂类抽象出一个接口,这个接口只有一个方法,便是创建抽象产品的工厂方法。然后所有要生产具体类的工厂,就会去实现这个接口。

这样,一个简单的工厂模式的工厂类,就变成了一个抽象接口和多个具体生成对象的工厂。这样,需要添加一个方法的时候,只需要添加一个实现类和一个工程类。

         不过这种判断逻辑还是存在的,工厂方法把简单工厂的内部逻辑判断转移到了客户端代码来运行,想要添加一个功能,以前是修改工厂类,现在是修改客户端。

 

         工厂方法克服了简单工厂违背开发-封闭原则的缺点,又保持了封装对象创建过程的优点。

 

----------------JDBC 工厂类的实现 ---------

        


/**每一个驱动类都必须实现这个接口*/
public
interface Driver {

Connection connect(String url, java.util.Properties info) throws SQLException; boolean acceptsURL(String url) throws SQLException; DriverPropertyInfo[] getPropertyInfo(String url, java.util.Properties info) throws SQLException; int getMajorVersion(); int getMinorVersion(); boolean jdbcCompliant(); public Logger getParentLogger() throws SQLFeatureNotSupportedException; }

 

        

/**
* 数据库厂商要提供一个数据库驱动类,它的作用可以是可以创造数据库连接,而这个数据库连接向上转型为我们JDBC的Connection。
* 数据库厂商要提供一个数据库连接的实现类,这个实现类可以执行具体数据库的各个操作,比如帮我们执行SQL,返回执行结果,关闭连接等等。
*/
public
interface Connection extends Wrapper { Statement createStatement() throws SQLException; PreparedStatement prepareStatement(String sql) throws SQLException; }

 

         mysql的驱动类位于com.mysql.jdbc.Driver,而mysql的connection实现类也在这个包中,名称是 ConnectionImpl。

         oracle也有驱动类,位于oracle.jdbc.driver.OracleDriver,相应的 oracle也有connection实现类,位于oracle.jdbc.OracleConnectionWrapper。

         一般每个数据库都会有一个 Connection的扩展接口,这个接口的作用是提供使用者针对当前数据库特殊的操作。

       

        工厂方法模式就是提供一个抽象的工厂,一个抽象的产品,在上述当中相当于Driver(数据库连接工厂)和Connection(抽象产品),实现的一方需要提供一个具体的工厂类(比如mysql驱动)和一个具体的产品(比如mysql数据库连接)。

        DriverMananger在这个设计当中扮演者一个管理者的角色,它帮我们管理数据 库驱动,让我们不需要直接接触驱动接口,我们获取连接只需要和DriverManager打交道就可以,也就是说客户端依赖于DriverManager 和Connection就可以完成工作,不再需要与Driver关联,所以上述说我们依赖于Driver和Connection,现在 DriverManager帮我们管理Driver,那我们只需要依赖于DriverManager和Connection就可以了。

 

链接:http://www.cnblogs.com/zuoxiaolong/p/pattern5.html

    

posted @ 2016-04-26 15:28  junjin4838  阅读(183)  评论(0编辑  收藏  举报