设计模式之抽象工厂模式

    抽象工厂模式是在原有的工厂模式中加入产品族的概念。要研究什么是抽象工厂模式就要首先了解什么是产品族。所谓产品族就是是指位于不同产品等级结构中,功能相关联的产品组成的家族。(摘抄自:百度百科)下面我用代码来解释一下什么是产品族。

    首先定义两个产品的接口:

public interface Cpu {
    public void run();
}

public interface Keyboard {
   public void input();
}

然后我们在定义四个具体的产品类,分别是ChineseCpu和AmericanCpu,ChineseKeyboard和AmericanKeyboard:

public class ChineseCpu implements Cpu{
    @Override
    public void run() {
        System.out.println("中国的cpu在运行");
    }
}

public class AmericanCpu implements Cpu{
    @Override
    public void run() {
        System.out.println("美国的cpu在运行");
    }
}

public class ChineseKeyboard implements Keyboard{
    @Override
    public void input() {
        System.out.println("中国的键盘在输入。。。");
    }
}

public class AmericanKeyboard implements Keyboard{
    @Override
    public void input() {
        System.out.println("美国的键盘在输入。。。");
    }
}

其中中国的cup和中国的键盘就可以看成一个产品族,美国的cpu和美国的键盘可以看成另一个产品族。

    知道了什么是产品族,接下来就要引入我们今天讨论的主题什么是抽象工厂模式。大家还记的工厂模式吗?我们为每一个产品创建了一个属于他们的工厂,那个抽象工厂我们就可以认为是为每一个产品族创建一个工厂。我们就以上面来举例,现在我们已经有了中国cpu,美国cpu,中国键盘和美国键盘。那个我们现在就需要一个工厂来生产这些产品,如果是工厂模式,那么我们至少还需要4个具体的工厂类来生产这些产品,所以这个时候我们可以使用抽象工厂模式来做。代码如下:1.首先我们需要创建一个工厂接口。

public interface Factory {
   public Cpu makeCpu();
   public Keyboard makeKeyboard();
}

2.定义两个实现工厂接口的实现类

public class ChineseFactory implements Factory{

    @Override
    public Cpu makeCpu() {
        return new ChineseCpu();
    }

    @Override
    public Keyboard makeKeyboard() {
        return new ChineseKeyboard();
    }

}

public class AmericanFactory implements Factory{

    @Override
    public Cpu makeCpu() {
        return new AmericanCpu();
    }

    @Override
    public Keyboard makeKeyboard() {
        return new AmericanKeyboard();
    }

}

3.当用户使用时

 public static void main(String[] args) {
         Factory AmericanFactory = new AmericanFactory();
         Cpu aCpu = AmericanFactory.makeCpu();
         aCpu.run();
         Keyboard aKeyboard = AmericanFactory.makeKeyboard();
         aKeyboard.input();
    }

我们可以看到每个工厂创建了一个产品族。通过使用抽象工厂模式可以解决具有相同(或者相似)等级结构的多个产品族中的产品对象的创建问题,使代码更加的简洁。

posted @ 2019-01-28 13:17  牧神风  阅读(129)  评论(0编辑  收藏  举报