一、工厂模式
是java中最常用的设计模式之一。属于创建型模式。
使用工厂模式,在创建对象时不会对客户端暴露创建逻辑,并且是使用同一个共同的接口来指向新创建的对象。
使用背景:
主要解决接口选择的问题,有明确的计划不同条件下创建不同的实例。定义一个创建对象的接口,让其子类自己决定实例化哪个工厂类,工厂模式使其创建过程延迟到子类进行。
二、简单工厂模式
步骤:
创建Car接口和实现Car接口的的实体类,创建工厂类CarFactory。在测试类中使用CarFactory来获取对应的Car对象。
2.1 Car接口
package com.factory.demo;
public interface Car {
void brand();
}
2.2 接口实现类
Audi.class
package com.factory.demo;
public class Audi implements Car {
@Override
public void brand() {
System.out.println("奥迪");
}
}
Ben.class
package com.factory.demo;
public class Ben implements Car {
@Override
public void brand() {
System.out.println("奔驰");
}
}
BMW.class
package com.factory.demo;
public class BMW implements Car {
@Override
public void brand() {
System.out.println("宝马");
}
}
2.3 工厂类
package com.factory.demo;
public class CarFactory {
public Car getCar(String carType) {
if(null == carType) {
return null;
}
if(carType.equalsIgnoreCase("BMW")) {
return new BMW();
}else if(carType.equalsIgnoreCase("BEN")) {
return new Ben();
}else if(carType.equalsIgnoreCase("Audi")) {
return new Audi();
}
return null;
}
}
2.4 测试类获取对应的实体对象
package com.factory.demo;
public class TestDemo {
public static void main(String[] args) {
CarFactory carFactory = new CarFactory();
Car car1 = carFactory.getCar("bmw");
car1.brand();
Car car2 = carFactory.getCar("ben");
car2.brand();
Car car3 = carFactory.getCar("audi");
car3.brand();
}
}
2.5 测试结果
三、抽象工厂模式
上面创建了不同品牌汽车,在为汽车创建颜色。
采用抽象工厂模式,步骤如下:
创建Car接口,以及Car接口的实现类,同上例。
创建Color接口,以及Color接口的实现类。
创建抽象工厂类,创建继承抽象工厂类的实体工厂类对象,根据不同信息生成对应的实体类。
创建FactoryProducer,传递信息来获取对应的工厂。
测试
3.1 Color接口
package com.abstractfactory.demo;
public interface Color {
void getCarColor();
}
3.2 Color接口实现类
Red.class
package com.abstractfactory.demo;
public class Red implements Color {
@Override
public void getCarColor() {
System.out.println("红色车");
}
}
Blue.class
package com.abstractfactory.demo;
public class Blue implements Color {
@Override
public void getCarColor() {
System.out.println("蓝色车");
}
}
White.class
package com.abstractfactory.demo;
public class White implements Color {
@Override
public void getCarColor() {
System.out.println("白色车");
}
}
3.3 抽象工厂类
package com.abstractfactory.demo;
/**
* 抽象工厂类
* @author Administrator
*
*/
public abstract class AbstractFactory {
public abstract Color getColor(String color);
public abstract Car getCar(String brand);
}
3.4 子工厂类
ColorFactory.class
package com.abstractfactory.demo;
public class ColorFactory extends AbstractFactory{
@Override
public Color getColor(String color) {
if(null == color) {
return null;
}
if(color.equalsIgnoreCase("blue")) {
return new Blue();
}else if(color.equalsIgnoreCase("red")) {
return new Red();
}else if(color.equalsIgnoreCase("white")) {
return new White();
}
return null;
}
@Override
public Car getCar(String brand) {
return null;
}
}
CarFactory.class
package com.abstractfactory.demo;
public class CarFactory extends AbstractFactory {
@Override
public Color getColor(String color) {
return null;
}
@Override
public Car getCar(String brand) {
if(null == brand) {
return null;
}
if(brand.equalsIgnoreCase("BMW")) {
return new BMW();
}else if(brand.equalsIgnoreCase("BEN")) {
return new Ben();
}else if(brand.equalsIgnoreCase("Audi")) {
return new Audi();
}
return null;
}
}
3.5 工厂生成类
package com.abstractfactory.demo;
public class FactoryProducer {
public static AbstractFactory getFactory(String choice) {
if(choice.equalsIgnoreCase("color")) {
return new ColorFactory();
} else if (choice.equalsIgnoreCase("Car")) {
return new CarFactory();
}
return null;
}
}
3.6 TestDemo
package com.abstractfactory.demo;
public class TestDemo {
public static void main(String[] args) {
//获取车工厂
AbstractFactory carFactory = FactoryProducer.getFactory("Car");
Car car = carFactory.getCar("BMW");
car.brand();
//获取颜色工厂
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
Color color = colorFactory.getColor("red");
color.getCarColor();
}
}
3.7 结果