1,工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
利用工厂模式可以降低程序的耦合性,为后期的维护修改提供了很大的便利。
将选择实现类、创建对象统一管理和控制。从而将调用者跟我们的实现类解耦
简单工厂:
简单工厂模式相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知到一些指定的参数
定义一个总的接口:
public interface Car { public void produce(); }
定义接口下的一些子类:
public class BMW implements Car { @Override public void produce() { System.out.println("宝马汽车生产。。。"); } } class Ferrari implements Car { @Override public void produce() { System.out.println("法拉利生产。。。"); } } class Buick implements Car { @Override public void produce() { System.out.println("别克汽车生产。。。"); } }
定义一个工厂,创建一个方法,来获得这些实例
public class CarFactroy { public static Car getCar(String name) { if (StringUtils.isEmpty(name)) { return null; } if (name.equals("BMW")) { return new BMW(); } if (name.equals("Ferrari")) { return new BMW(); } if (name.equals("Buick")) { return new Buick(); } return null; } }
通过传入指定的参数,通过工厂生产不同的对象
public class Client { public static void main(String[] args) { Car car = CarFactroy.getCar("BMW"); car.produce(); } }
简单工厂的缺点:如果对象很多,再对象工厂类里面就会维护的非常困难。
工厂方法:
工厂方法模式Factory Method,又称多态性工厂模式。在工厂方法模式中,核心的工厂类不再负责所有的产品的创建,而是将具体创建的工作交给子类去做。该核心类成为一个抽象工厂角色,仅负责给出具体工厂子类必须实现的接口,而不接触哪一个产品类应当被实例化这种细节。
简单工厂到工厂方法的演变,简单工厂的工厂不是生成对象的角色了,交给其他工厂去完成...
比如一个汽车会有好品牌,如果用简单工厂的话,每个品牌都用一个对象来维护,就会难以维护,尝试工厂方法:
定义个接口:
public interface Car { public void produce(String name); }
定义要接口下的子类:
public class BMW implements Car { @Override public void produce(String name) { System.out.println("宝马汽车" + name + "生产。。。"); } } class Ferrari implements Car { @Override public void produce(String name) { System.out.println("法拉利" + name + "生产。。。"); } } class Buick implements Car { @Override public void produce(String name) { System.out.println("别克汽车" + name + "生产。。。"); } }
定义汽车工厂:
//用来生产汽车的工厂 public interface CarFactroy { public Car getCar(String name); }
定义工厂下面的子类工厂(具体生产的某型号的工厂)
public class BMWFactory implements CarFactroy { @Override public Car getCar(String name) { return new BMW(); } } class FerrariFactory implements CarFactroy { @Override public Car getCar(String name) { return new Ferrari(); } } class BuickFactory implements CarFactroy { @Override public Car getCar(String name) { return new Buick(); } }
生产不同型号的汽车:
public class Client { public static void main(String[] args) { //BMW工厂 CarFactroy carFactroy = new BMWFactory(); Car X5 = carFactroy.getCar("BMW X5"); X5.produce("X5"); Car X7 = carFactroy.getCar("BMW X7"); X5.produce("X7"); } }
3 ,抽象工厂
抽象工厂简单地说是工厂的工厂,抽象工厂可以创建具体工厂,由具体工厂来产生具体产品。
例如上面的例子,每个品牌的汽车生产厂,汽车生产都要生产发动机,生产轮胎,可将具体的产品抽象为工厂
定义个工厂:这个工厂更像是组装厂,工厂的工厂,
//用来组装的工厂 public interface CarFactroy { //生产发动机 Engine assemblyEngine(); //生产论轮胎 Tyre assemblyTyre(); }
继续定义具体的发送机的工厂,轮胎的工厂
//生产发动机 public interface Engine { //压力测试 void pressureTest(); //功能测试 void eolTest(); }
public interface Tyre { //螺丝测试 void screwTest(); }
具体的实现:
public class BMWEngine implements Engine { @Override public void pressureTest() { System.out.println("宝马发动机压力测试"); } @Override public void eolTest() { System.out.println("宝马发动机功能测试"); } } class BMWTyre implements Tyre { @Override public void screwTest() { System.out.println("宝马轮胎螺丝测试"); } }
实现组装的工厂:
public class BMWFactory implements CarFactroy { @Override public Engine assemblyEngine() { return new BMWEngine(); } @Override public Tyre assemblyTyre() { return new BMWTyre(); } }
Client:
public class Client { public static void main(String[] args) { CarFactroy carFactroy = new BMWFactory(); Engine assemblyEngine = carFactroy.assemblyEngine(); Tyre assemblyTyre = carFactroy.assemblyTyre(); assemblyEngine.pressureTest(); assemblyTyre.screwTest(); } }