抽象工厂模式
抽象工厂模式是对工厂模式的进一步封装和拓展,属于一种创建模式,用工厂创建工厂的一种模式。其原理是使用抽象的超级工厂创建工厂,然后使用创建的工厂创建对象。
例如:使用多种不同的颜色画出多种不同的动物。
- 创建抽象工厂超级类
abstract class AbstractFactory {
abstract Animal getAnimal(String type);
abstract Color getColor(String color);
}- 创建Animal工厂
public interface Animal {
void print(Color color);
}
public class Cat implements Animal {
@Override
public void print(Color color) {
System.out.println("cur print cat(" + color + ")!");
}
}
public class Dog implements Animal {
@Override
public String toString() {
return super.toString();
}
@Override
public void print(Color color) {
System.out.println("cur print dog(" + color + ")!");
}
}
public class Pig implements Animal {
@Override
public String toString() {
return super.toString();
}
@Override
public void print(Color color) {
System.out.println("cur print pig(" + color + ")!");
}
}
public class AnimalFactory extends AbstractFactory {
@Override
Animal getAnimal(String type) {
if (type == null) {
return null;
}
if (type.equalsIgnoreCase("pig")) {
return new Pig();
} else if (type.equalsIgnoreCase("cat")) {
return new Cat();
} else if (type.equalsIgnoreCase("dog")) {
return new Dog();
}
return null;
}
@Override
Color getColor(String color) {
return null;
}
}- 创建Color工厂
public interface Color {
void draw();
}
public class Red implements Color {
@Override
public void draw() {
System.out.println("Into Red::draw()!");
}
@Override
public String toString() {
return Red.class.getSimpleName();
}
}
public class Green implements Color {
@Override
public void draw() {
System.out.println("Into Green::draw()!");
}
@Override
public String toString() {
return Green.class.getSimpleName();
}
}
public class Blue implements Color {
@Override
public void draw() {
System.out.println("Into Blue::draw()!");
}
@Override
public String toString() {
return Blue.class.getSimpleName();
}
}
public class ColorFactory extends AbstractFactory {
@Override
Animal getAnimal(String type) {
return null;
}
@Override
Color getColor(String shape) {
if (shape == null) {
return null;
}
if (shape.equalsIgnoreCase("red")) {
return new Red();
} else if (shape.equalsIgnoreCase("green")) {
return new Green();
} else if (shape.equalsIgnoreCase("blue")) {
return new Blue();
}
return null;
}
}- 创建工厂的FactoryProducer类
public class FactoryProducer {
public static AbstractFactory getFactory(String type) {
if (type == null) {
return null;
}
if (type.equalsIgnoreCase("color")) {
return new ColorFactory();
} else if (type.equalsIgnoreCase("animal")) {
return new AnimalFactory();
}
return null;
}
}- 测试
public static void main(String[] args) {
AbstractFactory shapeFactory = FactoryProducer.getFactory("color");
Color color1 = shapeFactory.getColor("red");
color1.draw();
Color color2 = shapeFactory.getColor("green");
color2.draw();
Color color3 = shapeFactory.getColor("blue");
color3.draw();
AbstractFactory printFactory = FactoryProducer.getFactory("animal");
Animal animal1 = printFactory.getAnimal("cat");
animal1.print(color1);
Animal animal2 = printFactory.getAnimal("dog");
animal2.print(color2);
Animal animal3 = printFactory.getAnimal("pig");
animal3.print(color3);
}- 运行测试
Into Red::draw()! Into Green::draw()! Into Blue::draw()! cur print cat(Red)! cur print dog(Green)! cur print pig(Blue)!