设计模式之抽象工厂模式

抽象工厂模式

一、模式定义

抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,属于对象创建型模式。
看完这段话,我也是有点懵。所以简单阐述一下我对抽象工厂模式的理解:
抽象工厂模式有大致4个角色:
1.抽象工厂:方法功能为生产产品,注意:将来实例化的类(工厂),生产的是一个品牌的一系列东西,比如小米厂只生产小米的东西(抽象工厂模式的特点
2.具体工厂:实现抽象工厂以及其方法
3.抽象产品:你可以将它想象成任何一个东西,万物皆可抽(当然这里只指抽象)
4.具体产品:比如小米电视,小米冰箱等(这里指的产品属于一个品牌)又是这个模式的特点。

看完上面的话,你会发现,有一个特点,就是一个工厂只生产一种品牌的一系列东西。这时候就需要引入新概念了:
产品等级结构:产品等级结构即产品的继承结构,例如一个抽象类是电视机,其子类有海尔电视机、海信电视机、TCL电视机,则抽象电视机与具体品牌的电视机之间构成了一个产品等级结构,抽象电视机是父类,而具体品牌的电视机是其子类。
产品族:在抽象工厂模式中,产品族是指由同一个工厂生产的,位于不同产品等级结构中的一组产品,例如海尔电器工厂生产的海尔电视机、海尔电冰箱,海尔电视机位于电视机产品等级结构中,海尔电冰箱位于电冰箱产品等级结构中。
概念很多,但是其实很简单。

同一产品等级结构其实就是同一种东西,比如上面说的电视产品等级结构!
同一产品族其实就是同一品牌,比如上面说的海信族,海尔族等

它们二者的关系如下图:
在这里插入图片描述
看到这里是不是很清晰了呢!
下面我用一个实例来加深了解一下:
实例:现有俩种工厂:
Pc工厂,Mac工厂,有俩种产品:内存和CPU
现在模拟抽象工厂模式设计模式生产产品!

二、具体实现

抽象工厂:abfactory 抽象方法功能:创建一个工厂
具体工厂:Pcfactory,Macfactory
抽象产品:cpu,ram
具体产品:
(Pc牌)Pccpu,Pcram
(Mac牌)Maccpu,Macram

Pcfactory生产Pc牌,Macfactory生产Mac牌
也就是一个工厂生产一个产品族不同产品等级结构的产品!

UML图了解一下大概架构:
在这里插入图片描述
完成后,我们在client客户端里创建一个抽象产品,抽象工厂,
然后创建一个Pcfactory工厂或者Macfactory,赋值给抽象工厂,将来调用方法时调用的是具体工厂的方法!
在这里插入图片描述
将Pcfactory改为Macfactory
在这里插入图片描述
总的来说,抽象工厂模式增加新的产品族是很方便的,比如要增加一个新品牌庆狗(这是我的舍友外号哈哈),你只需要要添加新工厂(庆狗工厂),新产品(庆狗CPU,庆狗ram),让这个工厂生产这个产品族就好。

但是如果要增加新的产品等级结构就要进行大幅改动,要改动抽象级别(父类级别)的东西,比如要增加一个手机产品,你需要增加抽象工厂中的方法来生产手机!
涉及到抽象层改动太大。
总结:
抽象工厂模式优点:
(1)隔离了具体类的生成,使得客户端并不需要知道什么被创建。
(2)当一个产品族中的多个对象被设计成一起工作时,它能够保证客户端始终只使用同一个产品族中的对象。
(3)增加新的产品族很方便,无须修改已有系统,符合开闭原则。
抽象工厂模式缺点:
(1)增加新的产品等级结构麻烦,需要对原有系统进行较大的修改,甚至需要修改抽象层代码,这显然会带来较大的不便,违背了开闭原则。

三、代码参考

abstractory:

package abstractfactory;

public interface abfactory {
    public cpu productcpu();
    public ram productram();
}

cpu:

package abstractfactory;

public interface cpu {
    public void productedcpu();
}

ram:

package abstractfactory;

public interface ram {
    public void productedram();
}

Pccpu:

package abstractfactory;

public class Pccpu implements cpu {
    public void productedcpu(){
        System.out.println("Pc端CPU已生产!");
    }
}

Maccpu:

package abstractfactory;

public class Maccpu implements cpu {
    public void productedcpu(){
        System.out.println("Mac端CPU已生产!");
    }
}

Pcram:

package abstractfactory;

public class Pcram implements ram {
    public void productedram(){
        System.out.println("Pc端内存已生产!");
    }
}

Macram:

package abstractfactory;

public class Macram implements ram {
    public void productedram(){
        System.out.println("Mac端内存已生产!");
    }
}

client:

package abstractfactory;

public class client {
    public static void main(String[] args){
        cpu cpu;
        ram ram;
        abfactory factory;
        //首先生产Pc端的产品族
        factory = new Macfactory();
        cpu = factory.productcpu();
        ram = factory.productram();
        cpu.productedcpu();
        ram.productedram();
    }
}

Pcfactory:

package abstractfactory;

public class Pcfactory implements abfactory {
    @Override
    public cpu productcpu() {
        return new Pccpu();
    }

    @Override
    public ram productram() {
        return new Pcram();
    }
}

Macfactory:

package abstractfactory;

public class Macfactory implements abfactory {
    @Override
    //实例化一个Mac端CPU,返回,下面相同
    public cpu productcpu() {
        return new Maccpu();
    }

    @Override
    public ram productram() {
        return new Macram();
    }
}

参考代码效果更好哦!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值