04设计模式——工厂方法模式
前言:以下总结来自龙哥---左潇龙博客。
总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern5.html
定义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。可以看到工厂方法模式中定义了一个工厂接口,而具体的创建工作推迟到具体的工厂类,它是对简单工厂模式中的工厂类进一步抽象化,从而产生一个工厂类的抽象和实现体系,从而弥补简单工厂模式对修改开放的诟病。
1 public interface IFactory { 2 IProduct product(); 3 }
1 public class FactoryA implements IFactory { 2 @Override 3 public IProduct product() { 4 return new ProductA(); 5 } 6 }
1 public class FactoryB implements IFactory { 2 @Override 3 public IProduct product() { 4 return new ProductB(); 5 } 6 }
1 public interface IProduct { 2 void start(); 3 void stop(); 4 }
1 public class ProductA implements IProduct { 2 @Override 3 public void start() { 4 System.out.println("A产品start"); 5 } 6 @Override 7 public void stop() { 8 System.out.println("A产品stop"); 9 } 10 }
1 public class ProductB implements IProduct { 2 @Override 3 public void start() { 4 System.out.println("B产品start"); 5 } 6 @Override 7 public void stop() { 8 System.out.println("B产品stop"); 9 } 10 }
1 public class Main { 2 public static void main(String[] args) { 3 IFactory factoryA = new FactoryA(); 4 IProduct productA = factoryA.product(); 5 productA.start(); 6 productA.stop(); 7 System.out.println("====================="); 8 IFactory factoryB = new FactoryB(); 9 IProduct productB = factoryB.product(); 10 productB.start(); 11 productB.stop(); 12 } 13 }
工厂方法模式就是提供一个抽象的工厂,一个抽象的产品,在上述当中相当于Driver(数据库连接工厂)和Connection(抽象产品),实现的一方需要提供一个具体的工厂类(比如mysql驱动)和一个具体的产品(比如mysql数据库连接)。
好处就是,从类关系上来说,它可以让客户端与具体的工厂与产品解耦,从业务角度来说,它让客户端与具体的产品解耦。
适用的场景就是我们需要一个产品帮我们完成一项任务,但是这个产品有可能有很多品牌(像这里的mysql,oracle),为了保持我们对产品操作的一致性,我们就可能要用到工厂方法模式。
两种使用方式一种是对使用者透明的,一种是不透明的,一种是使用者对具体的产品不关心,这种情况下,一般产品提供的功能是类似的。一种是使用者非常了解产品的特性,并想使用产品的特性,这种情况下,一般产品只提供最基本的一致的功能,但每个产品都会有自己独特的一面。