工厂模式:是一种类创建模型,适用于在创建多个复杂对象的时候(在不同情况下创建不同对象)。
工厂模式一般分为以下两种:
1.简单工厂模式:在工厂类定义创建不同对象实例的方法,在需要使用对象的地方,通过创建工厂并给出需要的对象名称来获取对象实例。
例如:车是一个大类,具体的车对象的父类都是车类,所以设定一个车工厂类,通过不同的车对象名称,创建并获取对应车对象,然后就可以通过具体的车对象调用与之对应的方法。
Car.java:
BMW.java:package com.factory.cls; public interface Car { void run(); }
QQ.java:package com.factory.cls; public class BMW implements Car{ @Override public void run() { System.out.println("BMW车在跑"); } }
FactoryCar:车工厂类package com.factory.cls; public class QQ implements Car{ @Override public void run() { System.out.println("QQ车在跑"); } }
package com.factory.cls; public class FactoryCar{ public Car getCar(String carName) { if(carName == null){ return null; } if("QQ".equals(carName)){ return new QQ(); }else if("BMW".equals(carName)){ return new BMW(); } return null; } }
测试类:在测试类中创建工厂,通过工厂获取对应名称的车对象,并能够调用车对象的方法。
package com.factory.cls; public class Test { public static void main(String[] args) { FactoryCar factory = new FactoryCar(); Car car = factory.getCar("BMW"); car.run(); } }
2.抽象工厂模式:工厂的工厂。例如:在上面1中Car简单工厂的基础上还有color工厂,在这时,就需要创建一个抽象工厂,用于抽象出根据需求获取对应车对象和获取对应颜色对象的方法,并且还应该有一个工厂创建工具类,用于根据需求创建颜色工厂还是车工厂对象,具体如下:
AbstractFactory.java:抽象工厂
FactoryCar.java:车工厂package com.factory.cls; public abstract class AbstractFactory { abstract Car getCar(String carName); abstract Color getColor(String colorName); }
FactoryColor.java:颜色工厂package com.factory.cls; public class FactoryCar extends AbstractFactory{ @Override Color getColor(String colorName) { // TODO Auto-generated method stub return null; } @Override Car getCar(String carName) { if(carName == null){ return null; } if("QQ".equals(carName)){ return new QQ(); }else if("BMW".equals(carName)){ return new BMW(); } return null; } }
Car.java:package com.factory.cls; public class FactoryColor extends AbstractFactory{ @Override Car getCar(String carName) { // TODO Auto-generated method stub return null; } @Override Color getColor(String colorName) { if(colorName == null){ return null; } if("blue".equals(colorName)){ return new Blue(); }else if("red".equals(colorName)){ return new Red(); } return null; } }
Color.java:package com.factory.cls; public interface Car { void run(); }
QQ.java:package com.factory.cls; public interface Color { void createColor(); }
BMW.java:package com.factory.cls; public class QQ implements Car{ @Override public void run() { System.out.println("QQ车在跑"); } }
Red.java:package com.factory.cls; public class BMW implements Car{ private int age; @Override public void run() { System.out.println("BMW车在跑"); } }
Blue.java:package com.factory.cls; public class Red implements Color{ @Override public void createColor() { // TODO Auto-generated method stub System.out.println("红色"); } }
FactoryBuilder.java:工厂创建工具类,用于根据名称创建车工厂对象还是颜色工厂对象。package com.factory.cls; public class Blue implements Color{ @Override public void createColor() { // TODO Auto-generated method stub System.out.println("蓝色"); } }
测试类:通过工厂创建工具类调用静态方法getFactory创建对应工厂,通过工厂创建并获取对应对象,再通过对象调用各自方法。package com.factory.cls; public class FactoryBuilder { public static AbstractFactory getFactory(String factoryName){ if("car".equals(factoryName)){ return new FactoryCar(); }else if("color".equals(factoryName)){ return new FactoryColor(); } return null; } }
package com.factory.cls; public class Test { public static void main(String[] args) { AbstractFactory factory = FactoryBuilder.getFactory("car"); Car car = factory.getCar("QQ"); factory = FactoryBuilder.getFactory("color"); Color color = factory.getColor("blue"); color.createColor(); car.run(); } }