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

@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();
    }
}

//main
public 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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值