设计模式——抽象工厂模式

来源:互联网 发布:达内java培训班有用吗 编辑:程序博客网 时间:2024/06/04 08:04

@Author:云都小生


工厂方法模式遗难



上一节我们说到工厂方法模式,我们来回顾一下它的缺点。如果增加一个产品,就需要增加一个新的工厂,然后添加一个新的产品类。如果需要越来越多的产品,就得有越来越多的工厂,这样势必会增加系统的开销。所以该到学习抽象工厂模式的时候了。


两个被挖过来的概念



抽象工厂模式,其实就是对相关的产品进行分类,把一些具有相关性的产品组合起来,由一个工厂统一生产。例如说,一家羽绒服工厂,能够生产A品牌的羽绒服,也能生产B品牌的羽绒服、C品牌的羽绒服。

这里需要分清楚两个概念,分别是产品等级结构产品族,这两个是我从刘伟博士的博客中看到的。

What is 产品等级结构?可以理解成同类型产品,不同品牌。笔记本有戴尔笔记本、华硕笔记本、联想笔记本。这是一个继承的关系,笔记本是父类(接口,各种品牌的笔记本是子类。

What is 产品族?同一个工厂生产同种品牌的产品,例如小米,他不止做手机,还做手环等等。这些相同品牌的产品构成了一个产品族。


抽象工厂模式的概念



从上面我概念,我们懂了工厂方法模式其实。但是一旦产品越来越多,就需要更多唯一的工厂类去实现,那多麻烦?

如果有3类产品,分别是电脑、电视、电冰箱,有三家企业都可以造这三种产品,那我们需不需要去定义

这就是抽象工厂模式的思维:产品等级结构将不同类的产品分开,将具有关系的产品放到一块去create。提供一个创建一系列相关对象的接口


一图胜千言



在抽象工厂模式中,依旧跟工厂方法模式拥用同样的角色:抽象工厂、具体工厂、抽象产品和具体产品。不同的是,抽象工厂提供了创建相同产品不同品牌的方法,而具体工厂实现了这些方法。


代码实现


//计算机抽象类(产品)abstract class Computer {    abstract void test();}//联想电脑(具体产品)public class ComputerLen extends Computer{    void test() {        System.out.println("这是联想笔记本");    }}//小米电脑(具体产品)public class ComputerMi extends Computer{    void test() {        System.out.println("这是小米笔记本");    }}//电视抽象类(产品)public abstract class Television {    abstract void test();}//小米电视(具体产品)public class TelevisionMi extends Television{    void test() {        System.out.println("这是小米电视!");    }}//联想电视(具体产品)public class TelevisionLen extends Television{    void test() {        System.out.println("这是联想电视!");    }}//抽象工厂interface Factory {    public Computer createComputer();    public Television createTelevision();}//联想工厂(具体工厂)public class LenovoFactory implements Factory{    public Computer createComputer() {        return new ComputerLen();    }    public Television createTelevision() {        return new TelevisionLen();    }}//小米工厂(具体工厂)public class MiFactory implements Factory {    public Computer createComputer() {        return new ComputerMi();    }    public Television createTelevision() {        return new TelevisionMi();    }}//mainpublic class Test {    public static void main(String[] args)    {        MiFactory factory = new MiFactory();        Computer computer = factory.createComputer();        computer.test();    }}


抽象方法模式的优点



优点:我们用抽象工厂模式,弥补了工厂方法模式的缺点,这样一来我们就减少了类的数量,降低了程序的复杂度。当我们想要新增其他品牌的产品时,只需要另外加一个类即可,如果我们想增加同个品牌的其他产品,只需要在那个类里面增加,不需要另外写一个类,这就减少了类的数量,降低了程序的复杂度。

2017/9/27 21:13:00 @Author:云都小生(Cloudking)

原创粉丝点击