美文网首页
[Design Pattern]抽象工厂模式

[Design Pattern]抽象工厂模式

作者: 浩成聊技术 | 来源:发表于2018-07-16 23:36 被阅读8次

什么是抽象工厂模式

上篇博客已经介绍了工厂模式,这里要介绍的是抽象工厂模式,它是工厂模式的父类工厂,可以创建其他的工厂。抽象工厂模式(Abstract Factory Pattern)是另一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。抽象工厂模式其实就是在工厂模式之上增加了一层抽象的概念。

代码实现

  • 代码思路:

创建两个工厂分别是画图的工厂ShapeFactory和填充颜色的工厂ColorFactory,再创建超级工厂FactoryProducer通过这个超级工厂来创建这两个工厂 。

  • UML类图(结合UML类图代码逻辑更为清晰)
pic1.png
1.定义形状接口,表示画不同形状的图形。实现它的3个类中都要实现它的 draw() 方法;同理定义颜色接口,表示为图形填充不同颜色
public interface Shape {
    void draw();
}

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

public class Rectangle implements Shape {
    public void draw(){
        System.out.println("画长方形");
    }
}

public class Square implements Shape {
    public void draw(){
        System.out.println("画正方形");
    }
}

public interface Color {
    void fill();
}

public class Blue implements Color {
    public void fill(){
        System.out.println("填充蓝色");
    }
}

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

public class Red implements Color {
    public void fill(){
        System.out.println("填充红色");
    }
}
2.定义形状工厂类,并在类中定义获取形状对象的方法,根据传入的参数创建不同的对象 equalsIgnoreCase() 是字符串的方法,可以忽略大小写比较字符串是否相等;颜色工厂类同理,根据传入的参数(颜色)创建不同的对象。
  • 首先定义一个抽象类,规定继承它的类必须实现的抽象方法
public abstract class AbstractFactory {
    public abstract Color getColor(String color);
    public abstract Shape getShape(String shap);
}

public class ShapeFactory extends AbstractFactory {
    public Shape getShape(String shapeType){
        if(shapeType == null) return null;
        if(shapeType.equalsIgnoreCase("circle")){
            return new Circle();
        }else if(shapeType.equalsIgnoreCase("rectangle")){
            return new Rectangle();
        }else if(shapeType.equalsIgnoreCase("square")){
            return new Square();
        }
        return null;
    }
    public Color getColor(String Color){
        return null;
    }
}


public class ColoreFactory extends AbstractFactory {
    public Shape getShape(String shapType){
        return null;
    }
    public Color getColor(String color){
        if(color == null) return null;
        if(color.equalsIgnoreCase("red")){
            return new Red();
        }else if(color.equalsIgnoreCase("green")){
            return new Green();
        }else if(color.equalsIgnoreCase("blue")){
            return new Blue();
        }
        return null;
    }
}
3.定义生成工厂类的类,即工厂类的构造器,通过传递形状或颜色信息来获取工厂。
public class FactoryProducer {
    public static AbstractFactory getFatory(String choice){
        if(choice.equalsIgnoreCase("shape")){
            return new ShapeFactory();
        }else if(choice.equalsIgnoreCase("color")){
            return new ColoreFactory();
        }
        return null;
    }
}
4.主类。使用 FactoryProducer(工厂类构造类) 来创建 AbstractFactory(工厂类),通过传递不同类型信息来获取不同的实体类的对象。
public class AbstractFactoryPatternDemo {
    public static void main(String[] args) {
        //获取形状工厂
        AbstractFactory shapeFactory = FactoryProducer.getFatory("shape");
        //获取形状为Cirlce的对象
        Shape shape1 = shapeFactory.getShape("circle");
        // 画圆
        shape1.draw();
        //获取形状为 Rectangle 的对象
        Shape shape2 = shapeFactory.getShape("RECTANGLE");
        //调用 Rectangle 的 draw 方法
        shape2.draw();
        
        
        //获取颜色工厂
        AbstractFactory colorFactory = FactoryProducer.getFatory("COLOR");
        //获取颜色为 Red 的对象
        Color color1 = colorFactory.getColor("RED");
        //调用 Red 的 fill 方法
        color1.fill();
        //获取颜色为 Green 的对象
        Color color2 = colorFactory.getColor("Green");
        //调用 Green 的 fill 方法
        color2.fill();
    }
}

抽象工厂模式应用

抽象工厂模式适合的结构:产品分为几个系列,在每个系列中,产品的布局是类似的,在一个系列中的某个产品,在另一个系列中有一个与之对应的产品。而不同几个系列中同一位置的产品可能是互斥的。它们可以根据不同的客户提供不同的解决方案

小结

  • 工厂模式和抽象工厂模式区别:

为了弄清楚,先介绍两个概念:

产品等级结构:比如一个抽象类是食物,其子类有苹果、牛奶等等,则抽象食物与具体食物名称之间构成了一个产品等级结构。食物是抽象的父类,而具体的食物名称是其子类。

产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品。如上述代码中 生产的形状、颜色,长方形属于形状类等级结构中,而红色则属于颜色产品等级结构中。

工厂方法模式:针对 一个产品等级结构。

抽象工厂模式:针对 多个产品等级结构,即产品族。

关于作者

个人博客: http://yhch.xyz

相关文章

网友评论

      本文标题:[Design Pattern]抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/kuvipftx.html