实现了创建者和调用者的分离。在创建一个对象时不向客户暴露内部细节,并提供一个创建对象的通用接口。
实例化对象,用工厂方法代替new操作。 将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦。
简单工厂模式也叫静态工厂模式,就是工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例。 对于增加新产品无能为力!不修改代码的话,是无法扩展的。
简单工厂模式的代码如下
//汽车工厂类 public class CarFactory { public static Car createCar(String type){ if("奥迪".equals(type)){ return new Audi(); }else if("奔驰".equals(type)){ return new Benz(); }else{ return null; } } }汽车接口
public interface Car { void run(); }两个汽车接口实现类
public class Audi implements Car { @Override public void run() { System.out.println("奥迪再跑!"); } } public class Benz implements Car { @Override public void run() { System.out.println("奔驰再跑!"); } }客户端类
//调用者 public class Client02 { public static void main(String[] args) { Car c1 =CarFactory.createCar("奥迪"); Car c2 = CarFactory.createCar("奔驰"); c1.run(); c2.run(); } }UML图如下
为了避免简单工厂模式的缺点,不完全满足OCP。 工厂方法模式和简单工厂模式最大的不同在于,简单工厂模式只有一个(对于一个项目或者一个独立模块而言)工厂类,而工厂方法模式有一组实现了相同接口的工厂类。 工厂方法定义了一个创建对象的接口,但由子类决定要实例化哪个类。工厂方法把实例化操作推迟到子类。 具体栗子如下所示 //汽车接口以及对应的实现类
public interface Car { void run(); } public class Audi implements Car { @Override public void run() { System.out.println("奥迪在跑!"); } } public class Byd implements Car { @Override public void run() { System.out.println("比亚迪在跑!"); } }工厂接口以及对应的实现类
public interface CarFactory { Car createCar(); } public class AudiFactory implements CarFactory { @Override public Car createCar() { return new Audi(); } } public class BydFactory implements CarFactory { @Override public Car createCar() { return new Byd(); } }客户端类
public class Client { public static void main(String[] args) { Car c1 = new AudiFactory().createCar(); Car c2 = new BydFactory().createCar(); c1.run(); c2.run(); } }上述代码的uml图如下
根据设计理论建议:工厂方法模式。但实际上,我们一般都用简单工厂模式。
用来生产不同产品族的全部产品。(对于增加新的产品,无能为力;支持增加产品族) 抽象工厂模式是工厂方法模式的升级版本,在有多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。 抽象工厂的栗子代码如下 //产品接口及其实现类
public interface Engine { void run(); void start(); } class LuxuryEngine implements Engine{ @Override public void run() { System.out.println("转的快!"); } @Override public void start() { System.out.println("启动快!可以自动启停!"); } } class LowEngine implements Engine{ @Override public void run() { System.out.println("转的慢!"); } @Override public void start() { System.out.println("启动慢!"); } } public interface Tyre { void revolve(); } class LuxuryTyre implements Tyre { @Override public void revolve() { System.out.println("旋转不磨损!"); } } class LowTyre implements Tyre { @Override public void revolve() { System.out.println("旋转磨损快!"); } } public interface Seat { void massage(); } class LuxurySeat implements Seat { @Override public void massage() { System.out.println("可以自动按摩!"); } } class LowSeat implements Seat { @Override public void massage() { System.out.println("不能按摩!"); } }//抽象工厂及其实现类
public interface CarFactory { Engine createEngine(); Seat createSeat(); Tyre createTyre(); } public class LowCarFactory implements CarFactory { @Override public Engine createEngine() { return new LowEngine(); } @Override public Seat createSeat() { return new LowSeat(); } @Override public Tyre createTyre() { return new LowTyre(); } } public class LuxuryCarFactory implements CarFactory { @Override public Engine createEngine() { return new LuxuryEngine(); } @Override public Seat createSeat() { return new LuxurySeat(); } @Override public Tyre createTyre() { return new LuxuryTyre(); } }//客户端类
public class Client { public static void main(String[] args) { CarFactory factory = new LuxuryCarFactory(); Engine e = factory.createEngine(); e.run(); e.start(); } }抽象工厂的UML图如下所示