工厂模式
简单工厂模式是工厂模式家族中最简单实用的模式,可以理解为是不同工厂模式的一个特殊实现。
可以看出,上面总共有三种类,一个是工厂类Creator,一个是产品接口IProduct,一个便是具体的产品,例如产品A和产品B,这之中,工厂类负责整个创建产品的逻辑判断,所以为了使工厂类能够知道我们需要哪一种产品,我们需要在创建产品时传递给工厂类一个参数,去表明我们想要创建哪种产品。将上面类图转化成代码如下:
public interface IProduct { public void method(); }
public class ProductA implements IProduct{ public void method() { System.out.println("产品A方法"); } }
public class ProductB implements IProduct{ public void method() { System.out.println("产品B方法"); } }
//工厂类 public class Creator { private Creator(){} public static IProduct createProduct(String productName){ if (productName == null) { return null; } if (productName.equals("A")) { return new ProductA(); }else if (productName.equals("B")) { return new ProductB(); }else { return null; } } }
以上是简单工厂模式,如果新增一个产品需要在工厂中增加一个if判断,这种也不是一种很好的解耦,在一下篇中的抽象工厂的设计模式中,将工厂也进一步抽象,让工厂只生产某一种产品;
工厂方法模式
对工厂的进一步抽象;
可以看到工厂方法模式中定义了一个工厂接口,而具体的创建工作推迟到具体的工厂类,它是对简单工厂模式中的工厂类进一步抽象化,从而产生一个工厂类的抽象和实现体系,从而弥补简单工厂模式对修改开放的诟病。下面右半部分是产品抽象和实现体系,左半部分是工厂抽象和实现体系,其中工厂体系依赖于产品体系,每一个工厂负责创造一种产品,这就省去了简单工厂中的elseif判断,又客户端决定实例化一个特定的工厂去创建相应的产品。
抽象产品接口
public interface Light { public void turnOn(); public void turnOff(); }
具体产品
public class BuldLight implements Light{ public void turnOn() { System.out.println("BuldLight On"); } public void turnOff() { System.out.println("BuldLight Off"); } }
public class TubeLight implements Light{ public void turnOn() { System.out.println("TubeLight On"); } public void turnOff() { System.out.println("TubeLight Off"); } }
抽象的工厂接口
public interface Creator { public Light createLight(); }
产品的具体工厂
public class BuldCreator implements Creator{ public Light createLight() { return new BuldLight(); } }
public class TubeCreator implements Creator{ public Light createLight() { return new TubeLight(); } }
测试类:
public class Client { public static void main(String[] args) { Creator creator = new BuldCreator(); Light light = creator.createLight(); light.turnOn(); light.turnOff(); creator = new TubeCreator(); light = creator.createLight(); light.turnOn(); light.turnOff(); } }
输出结果:
工厂方法模式弥补了简单工厂模式不满足开闭原则的诟病,当我们需要增加产品时,只需要增加相应的产品和工厂类,而不需要修改现有的代码。
抽象工厂模式