抽象工厂模式

1.抽象工厂模式概述
抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属
于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。

意图:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
主要解决:主要解决接口选择的问题。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
使用场景:(1)QQ 换皮肤,一整套一起换。 (2)生成不同操作系统的程序。
注意事项:产品族难扩展,产品等级易扩展。

 

2.Java Demo

interface Shape {
    void draw();
}

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

class Scquare implements Shape {
    @Override
    public void draw() {
        System.out.println("Scquare::draw()");
    }
}


interface Color {
    void fill();
};

class Red implements Color {
    public void fill() {
        System.out.println("Red::fill()");
    }
};

class Green implements Color {
    public void fill() {
        System.out.println("Green::fill()");
    }
};



abstract class AbstractFactory {
    public abstract Shape getShape(String shapeType);
    public abstract Color getColor(String colorType);
};



class ShapeFactory extends AbstractFactory {
    @Override
    public Shape getShape(String shapeType) {
        if (shapeType == null) {
            return null;
        }

        if (shapeType.equalsIgnoreCase("rectangle")) {
            return new Rectangle();
        } else if (shapeType.equalsIgnoreCase("scquare")) {
            return new Scquare();
        }

        return null;
    }
    @Override
    public Color getColor(String colorType) { //没用上, 去掉public不行,因为父类中是public的,子类中不能修改权限(C++中是可以的)
        return null;
    }
}

class ColorFactory extends AbstractFactory {
    public Color getColor(String colorType) {
        if (colorType == null) {
            return null;
        }

        if (colorType.equalsIgnoreCase("red")) {
            return new Red();
        } else if (colorType.equalsIgnoreCase("green")) {
            return new Green();
        }

        return null;
    }
    @Override
    public Shape getShape(String shapeType) { //没用上也要实现,因为下面使用了new ColorFactory()实例化对象了
        return null;
    }
}

class FactoryProducer {
    public static AbstractFactory getFactory(String type) { //static方法,通过"类名.方法名"直接调用(C++中是使用作用域描述符"::")
        if (type == null) {
            return null;
        }
        if (type.equalsIgnoreCase("shape")) {
            return new ShapeFactory();
        } else if (type.equalsIgnoreCase("color")) {
            return new ColorFactory();
        }

        return null;
    }
}


public class FactoryPatternDemo {
    public static void main(String args[]) {

        AbstractFactory shape_factory = FactoryProducer.getFactory("shape"); //java中的作用域描述符(类比于C++)也是也是通过"."来实现
        AbstractFactory color_factory = FactoryProducer.getFactory("color");

        Shape rectangle = shape_factory.getShape("rectangle");
        Shape scquare = shape_factory.getShape("scquare");
        rectangle.draw();
        scquare.draw();

        Color red = color_factory.getColor("red");
        Color green = color_factory.getColor("green");
        red.fill();
        green.fill();

    }
}

 

 

 

 

参考:http://www.runoob.com/design-pattern/abstract-factory-pattern.html

 

posted on 2019-04-06 19:38  Hello-World3  阅读(127)  评论(0编辑  收藏  举报

导航