抽象工厂模式

来源:互联网 发布:西马智能马桶好吗 知乎 编辑:程序博客网 时间:2024/06/11 14:45

抽象工厂模式(创建型模式)

抽象工厂模式是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

主要解决:主要解决接口选择的问题。

何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。

如何解决:在一个产品族里面,定义多个产品。

关键代码:在一个工厂里聚合多个同类产品。

应用实例:服装方面。比如说商务装(成套、一系列具体产品)、时尚装(成套、一系列具体产品)、运动装(成套、一系列具体产品)等。在您的家中,某个衣柜(具体工厂)只能存放某一种这样的衣服(成套、一系列具体产品),每次拿这种成套的衣服也自然要从这个衣柜中取出。用面向对象的思想去理解,所有的衣柜(具体工厂)都是衣柜类的(抽象工厂)某一个,而每一件成套的衣服有包括具体的上衣(某一具体产品),裤子(某一具体产品)。

优点:当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终使用同一产品组中的对象。

缺点:产品组扩展非常困难,要增加一个系列的某一产品,既要在抽象的Creator里加代码,又要在具体的里面加代码

**使用场景:**1、QQ换肤,一整套一起换。2、生成不同操作系统的程序。

注意事项:产品族难扩展,产品等级易扩展。

实现

步骤1
为形状创建一个接口,Shape.java

public interface Shape {    void draw();}

步骤2
实现shape接口

Circle.java

public class Circle implements Shape {    @Override    public void draw() {        System.out.println("画圆");    }}

Rectangle.java

public class Rectangle implements Shape {    @Override    public void draw() {        System.out.println("画矩形");    }}

步骤3
创建Color接口

Color.java

public interface Color {    void fill();}

步骤4
实现Color接口

Green.java

public class Green implements Color {    @Override    public void fill() {        System.out.println("填充绿色");    }}

Red.java

public class Red implements Color {    @Override    public void fill() {        System.out.println("填充红色");    }}

步骤5
创建工厂抽象类

AbstractFactory.java

public abstract class AbstractFactory {    public abstract Shape getShape(String shape);    public abstract Color getColor(String color);}

步骤6
创建扩展了抽象类的工厂类、

ShapeFactory.java

public class ShapeFactory extends AbstractFactory {

@Overridepublic Shape getShape(String shape) {    if ("rectangle".equals(shape)) {        return new Rectangle();    } if ("circle".equals(shape)) {        return new Circle();    }    return null;}@Overridepublic Color getColor(String color) {    return null;}

}

ColorFactory.java

public class ColorFactory extends AbstractFactory {    @Override    public Shape getShape(String shape) {        // TODO Auto-generated method stub        return null;    }    @Override    public Color getColor(String color) {        if ("green".equals(color))            return new Green();        if ("red".equals(color))            return new Red();        return null;    }}

步骤7
创建工厂生成类,来生成ColorFactory和ShapeFactory工厂

public class FactoryProducer {    public static AbstractFactory getFactory(String choice) {        if ("shape".equals(choice)) {            return new ShapeFactory();        }        if ("color".equals(choice)) {            return new ColorFactory();        }        return null;    }}

测试

public class Test {    public static void main(String[] args) {        AbstractFactory shapeFactory = FactoryProducer.getFactory("shape");        Shape circle = shapeFactory.getShape("circle");        circle.draw();        AbstractFactory colorFactory = FactoryProducer.getFactory("color");        Color green = colorFactory.getColor("green");        green.fill();    }}

测试结果

画圆填充绿色