标签:
工厂模式代码模型
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
标签:
原文地址:http://www.cnblogs.com/junjin4838/p/5435281.html