设计模式-抽象工厂
抽象工厂
定义:用一个超级工厂创建其他工厂,每个生成的工厂都能跟简单工厂一样创建对象。他与工厂方法不同的是:有一系列创建抽象产品的方法,而不是一个。
使用场景:需要生产的产品多于一个产品类型,而系统只使用其中一种产品类型。
1,首先从简单工厂进化到工厂方法,是因为工厂方法弥补了简单工厂对修改开放的弊端,即简单工厂违背了开闭原则。
2,从工厂方法进化到抽象工厂,是因为抽象工厂弥补了工厂方法只能创造一个系列的产品的弊端。
代码示例:
public abstract class AbstractFactory {
public abstract Shape getShape(String shapeType);
public abstract Color getColor(String colorType);
}
public interface Color {
void fill();
}
public interface Shape {
void draw();
}
public class ColorFactory extends AbstractFactory{
@Override
public Shape getShape(String shapeType) {
return null;
}
@Override
public Color getColor(String colorType) {
if(colorType.equalsIgnoreCase("red")){
return new Red();
}
return null;
}
}
public class ShapeFactory extends AbstractFactory {
@Override
public Shape getShape(String shapeType) {
if(shapeType==null){
return null;
}else if("CIRCLE".equalsIgnoreCase(shapeType)){
return new Circle();
}else if("SQUARE".equalsIgnoreCase(shapeType)){
return new Square();
}else if("RECTANGLE".equalsIgnoreCase(shapeType)){
return new Rectangle();
}
return null;
}
@Override
public Color getColor(String colorType) {
return null;
}
}
public class Red implements Color {
@Override
public void fill() {
System.out.println("填充红色");
}
}
public class Circle implements Shape {
@Override
public void draw() {
System.out.println("我会画");
}
}
public class FactoryProducer {
public static AbstractFactory getFactory(String type){
if(type.equalsIgnoreCase("shape")){
return new ShapeFactory();
}else if(type.equalsIgnoreCase("color")){
return new ColorFactory();
}
return null;
}
}
测试方法:
public class ParteenDemo {
public static void main(String[] args) {
AbstractFactory colorFactory = FactoryProducer.getFactory("color");
Color color = colorFactory.getColor("red");
color.fill();
AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");
Shape circle = shapeFactory.getShape("circle");
circle.draw();
}
}
书山有路勤为径,学海无涯苦作舟