浅谈简单工厂、工厂模式、抽象工厂
一:简单工厂模式
简单工厂的定义:提供一个创建对象实例的功能,而无序关心其具体实现,被创建实例的类可以是接口、抽象类也可以是具体的类。
实现汽车接口
package GOF.factory.simpleFactory; /** * 公共汽车接口 */ public interface Car { public String getCarName(); }
奔驰类
package GOF.factory.simpleFactory; /** * 奔驰类 */ public class BenChi implements Car { @Override public String getCarName() { // System.out.println("奔驰"); return "奔驰"; } }
宝马类
package GOF.factory.simpleFactory; public class BaoMa implements Car{ @Override public String getCarName() { // System.out.println("宝马"); return "宝马"; } }
简单工厂
package GOF.factory.simpleFactory; /** * 简单工厂 * 既能生产奔驰又能生产宝马 */ public class SimpleFactory { public Car getCar(String name){ if(name.equals("BMW")){ return new BaoMa(); }else if (name.equals("Ben")){ return new BenChi(); }else { System.out.println("暂时无法生产!"); return null; } } }
测试类
package GOF.factory.simpleFactory; public class test { public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); Car car1 = simpleFactory.getCar("Ben"); System.out.println(car1.getCarName()); Car car2 = simpleFactory.getCar("BMW"); System.out.println(car2.getCarName()); } }
测试结果
根据简单工厂的定义,用户只要产品而不在乎如何生产,看起来好像很完美的样子,但是大家想想,这个世界存在什么都生产的工厂吗?
显然是不存在的,每一个汽车品牌都有自己的生产工厂,都有自己的技术,映射到spring中,我们有很多很多的bean需要生产,如果单靠一个简单工厂来实现,那么我们得在工厂嵌套多少个if..else啊?
而且我们在代码中生产一辆汽车只是new一下就出来了,但是实际操作中却不知道需要多少进行操作,加载、注册等操作都将体现在工厂类中,那么这个类就会变得很紊乱,管理起来也很不方便,所以说每个品牌应该有自己的生产类。所以工厂方法出现了。
二、工厂方法
工厂接口
package GOF.factory.factoryMethod; import GOF.factory.simpleFactory.Car; /** * 定义工厂接口,功能就是生产汽车 */ public interface Factory { Car getCar(); }
宝马工厂
package GOF.factory.factoryMethod; import GOF.factory.simpleFactory.BaoMa; import GOF.factory.simpleFactory.Car; public class BMWFactory implements Factory { @Override public Car getCar() { return new BaoMa(); } }
奔驰工厂
package GOF.factory.factoryMethod; import GOF.factory.simpleFactory.BenChi; import GOF.factory.simpleFactory.Car; public class BenzFactory implements Factory { @Override public Car getCar() { return new BenChi(); } }
测试类
package GOF.factory.factoryMethod; public class test { public static void main(String[] args) { //宝马 Factory factory = new BMWFactory(); System.out.println(factory.getCar().getCarName()); //奔驰 Factory factory1 = new BenzFactory(); System.out.println(factory1.getCar().getCarName()); } }
测试结果
根据上述代码可以看出,不同的品牌的汽车是由不同的工厂生产的,貌似又是很完美的。但是大家看一下测试类,当一个人想要去买一辆宝马汽车的时候,那么他就要找宝马工厂给他生产一辆,过几天有想要买一辆奔驰车的时候,又得跑到奔驰工厂请人生产,这无疑就增加了用户的操作复杂性。所以有没有一种方法方便用户操作呢?这个时候抽象工厂就出现了。
三、抽象工厂
抽象工厂
public abstract class AbstractFactory { protected abstract Car getCar(); //这段代码就是动态配置的功能 //固定模式的委派 public Car getCar(String name){ if("BMW".equalsIgnoreCase(name)){ return new BmwFactory().getCar(); }else if("Benz".equalsIgnoreCase(name)){ return new BenzFactory().getCar(); }else if("Audi".equalsIgnoreCase(name)){ return new AudiFactory().getCar(); }else{ System.out.println("这个产品产不出来"); return null; } } }
默认工厂
public class DefaultFactory extends AbstractFactory { private AudiFactory defaultFactory = new AudiFactory(); public Car getCar() { return defaultFactory.getCar(); } }
宝马工厂
public class BMWFactory extends AbstractFactory { @Override public Car getCar() { return new BMW(); } }
奔驰工厂
public class BenzFactory extends AbstractFactory { @Override public Car getCar() { return new Benz(); } }
测试类
public class AbstractFactoryTest { public static void main(String[] args) { DefaultFactory factory = new DefaultFactory(); System.out.println(factory.getCar("Benz").getName()); } }
测试结果
Benz
根据上述代码可以看出,用户需要一辆汽车,只需要去找默认的工厂提出自己的需求(传入参数),便能得到自己想要产品,而不用根据产品去寻找不同的生产工厂,方便用户操作。