设计模式学习笔记(4)——抽象工厂模式

本人做的设计模式学习笔记系列的博文旨在用于个人学习之用,主要记载自己对设计模式的理解及代码的实现

抽象工厂模式

抽象工厂模式引入了“产品族”产品等级结构的概念,一个产品族就好像一个品牌的工厂一样,而产品的等级结构是对不同工厂生产的同类产品而言的。例如,有A工厂生产A牌电冰箱、A牌电视机和A牌收音机。B工厂生产B牌电冰箱、B牌电视机和B牌收音机。那么,A牌电冰箱、A牌电视机和A牌收音机就构成一个产品族,而A牌电冰箱和B牌电冰箱就构成了一个产品等级结构。以下给出代码模板

/*
 * 抽象工厂类和抽象产品类
 * */
interface TV{
    public void show();
}

interface Fridge{
    public void show();
}

interface Radio{
    public void show();
}

interface Factory{
    public TV createTV();
    public Fridge createFridge();
    public Radio createRadio();
}

/*
 * 具体产品类
 * */
class Atv implements TV {

    @Override
    public void show() {
        System.out.println("A TV show() ");
    }

}
class AFridge implements Fridge{

    @Override
    public void show() {
        System.out.println("A Fridge show() ");
    }

}
class ARadio implements Radio{

    @Override
    public void show() {
        System.out.println("A Radio show()");
    }

}

class Btv implements TV {

    @Override
    public void show() {
        System.out.println("B TV show() ");
    }

}
class BFridge implements Fridge{

    @Override
    public void show() {
        System.out.println("B Fridge show() ");
    }

}
class BRadio implements Radio{

    @Override
    public void show() {
        System.out.println("B Radio show()");
    }

}

/*
 * 具体产品类
 * */
 class AFactory implements Factory{

    @Override
    public TV createTV() {
        return new Atv();
    }

    @Override
    public Fridge createFridge() {
        return new AFridge();
    }

    @Override
    public Radio createRadio() {
        return new ARadio();
    }
}

 class BFactory implements Factory{

    @Override
    public TV createTV() {
        return new Btv();
    }

    @Override
    public Fridge createFridge() {
        return new BFridge();
    }

    @Override
    public Radio createRadio() {
        return new BRadio();
    }
 }



public class AbstractFactoryPattern {
    public static void main(String[] args) {
        AFactory aFactory=new AFactory();
        aFactory.createTV().show();
        aFactory.createFridge().show();
        aFactory.createRadio().show();
        BFactory bFactory=new BFactory();
        bFactory.createTV().show();
        bFactory.createFridge().show();
        bFactory.createRadio().show();
    }
}

运行结果:

A TV show()
A Fridge show()
A Radio show()
B TV show()
B Fridge show()
B Radio show()

  抽象工厂模式最大的缺点是新建产品族方便而新建新的产品等级结构比较麻烦。例如A厂想要新增加一个产品,吹风机,那么要在抽象工厂类中新增制造吹风机的方法声明。由于A工厂类和B工厂类都实现同一个接口,所以即使B工厂类不需要新增吹风机这项产品,B工厂类也不得不新增。所以抽象工厂模式在新建产品族的方面很好地支持了开闭原则,但在新增产品等级结构方面则违背了开闭原则。

你可能感兴趣的:(设计模式)