1.2工厂模式-抽象工厂

简介

抽象工厂:抽象产品,具体产品,抽象工厂,具体工厂。

但是抽象工厂多出了产品族,它和工厂方法模式的区别就在于需要创建对象的复杂程度上。而且抽象工厂模式是三个里面最为抽象、最具一般性的。抽象工厂模式的用意为:给客户端提供一个接口,可以创建多个产品族中的产品对象。

产品族:个人理解就是同一类产品,而抽象工厂能生产多类产品。

类图

代码

/**  
 * 抽象工厂-产品族-抽象产品
 * 圆形
 * @author: 张彬
 * @date: 2018年3月22日 下午2:44:27
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午2:44:27
 */
public interface Circle {
    public void draw();
}
/**  
 * 抽象工厂-产品族-具体产品
 * 绿圆形
 * @author: 张彬
 * @date: 2018年3月22日 下午3:07:48
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午3:07:48
 */
public class GreenCircle implements Circle {
    @Override
    public void draw() {
       System.out.println("in GreenCircle::draw() method.");
    }
 }
/**  
 * 抽象工厂-产品族-具体产品
 * 红圆形
 * @author: 张彬
 * @date: 2018年3月22日 下午3:07:48
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午3:07:48
 */
public class RedCircle implements Circle {
    @Override
    public void draw() {
       System.out.println("in RedCircle::draw() method.");
    }
 }
/**  
 * 抽象工厂-产品族-抽象产品
 * 矩形
 * @author: 张彬
 * @date: 2018年3月22日 下午2:44:27
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午2:44:27
 */
public interface Rectangle {
    public void draw();
}
/**
 * 抽象工厂-产品族-具体产品  
 * 绿矩形
 * @author: 张彬
 * @date: 2018年3月22日 下午2:46:10
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午2:46:10
 */
public class GreenRectangle implements Rectangle {

    @Override
    public void draw() {
       System.out.println("in GreenRectangle::draw() method.");
    }
 }
/**
 * 抽象工厂-产品族-具体产品  
 * 红矩形
 * @author: 张彬
 * @date: 2018年3月22日 下午2:46:10
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午2:46:10
 */
public class RedRectangle implements Rectangle {

    @Override
    public void draw() {
       System.out.println("in RedRectangle::draw() method.");
    }
 }
/**  
 * 抽象工厂-抽象工厂
 * @author: 张彬
 * @date: 2018年3月22日 下午4:05:24
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午4:05:24
 */
public interface AbstractFactory {
    Circle getCircle();
    Rectangle getRectangle();
}
/**  
 * 抽象工厂-具体工厂
 * 生产红色图形
 * @author: 张彬
 * @date: 2018年3月22日 下午3:15:59
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午3:15:59
 */
public class RedShapeFactory implements AbstractFactory{
    @Override
    public RedCircle getCircle() {
        return new RedCircle();
    }
    @Override
    public RedRectangle getRectangle() {
        return new RedRectangle();
    }
}
/**  
 * 抽象工厂-具体工厂
 * 生产绿色图形
 * @author: 张彬
 * @date: 2018年3月22日 下午3:15:59
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午3:15:59
 */
public class GreenShapeFactory implements AbstractFactory{
    @Override
    public GreenCircle getCircle() {
        return new GreenCircle();
    }
    @Override
    public GreenRectangle getRectangle() {
        return new GreenRectangle();
    }
}
/**  
 * 客户端-测试
 * @author: 张彬
 * @date: 2018年3月22日 下午3:04:34
 * @version: V1.0
 * @review: 张彬/2018年3月22日 下午3:04:34
 */
public class AbstractFactoryDemo {

    public static void main(String[] args) {
        AbstractFactory greenShapeFactory = new GreenShapeFactory();
        greenShapeFactory.getCircle().draw();;
        greenShapeFactory.getRectangle().draw();
        
        AbstractFactory redShapeFactory = new RedShapeFactory();
        redShapeFactory.getCircle().draw();;
        redShapeFactory.getRectangle().draw();
    }
 }

输出结果:

in GreenCircle::draw() method.
in GreenRectangle::draw() method.
in RedCircle::draw() method.
in RedRectangle::draw() method.

工厂模式总结。

工厂模式的好处就在于将工厂和产品之间的耦合降低,将具体产品的构造过程放在了具体工厂类里面。
  • 简单工厂模式,相当于是一个工厂中有各种产品,创建在一个类中,客户无需知道具体产品的名称,只需要知道产品类所对应的参数即可。但是工厂的职责过重,而且当类型过多时不利于系统的扩展维护。如果增加一个产品,要修改工厂类,不符合开闭原则。
  • 工厂方法模式,相当于在简单工厂模式的基础上增加一个抽象工厂,如果增加一个产品,只需要增加具体工厂和具体产品即可。对一种产品的等级模式,生成某一种基类下的对象。
  • 抽象工厂模式,可应对多种产品等级模式,引入产品族,类似于一个集团旗下生产的各种产品的工厂,这些产品是一个产品族。是在工厂方法下的扩展,可生成多种基类下的对象。




















猜你喜欢

转载自blog.csdn.net/u011260970/article/details/79896092