设计模式之抽象工厂模式

概要

设计模式是一门艺术,如果真正了解这门艺术,你会发现,世界都将变得更加优美。

定义

为创建一组相关或者相互依赖的对象,提供一个接口,但是不需要指定他们的具体类

使用场景

一组对象具有相同的约束条件的可以使用抽象工厂模式,是不是有点感觉好模糊,有点抽象?简单的来讲,就是两种产品,具有不同的特性

比如:

1.市场上的白加黑,虽然都能治疗感冒,由不同的商家产出,成分肯定不同,特性效果肯定不一样

2.比如奥迪汽车,有q3,q5,等,虽然都是奥迪,但是可能制动系统,发动机等可能就不一样,有些高配,有些低配,带天窗和不带天窗等等

那这个抽象工厂模式和前面的工厂方法模式有什么区别呢,我们接下去往下看

UML

这里写图片描述

在这里看到这个类图,然后可能就 what is fuck!什么东西,这么多,但是其实并不复杂

在这之前,我很少过多解释类图之间的关系,详细的说明等,说真的,前面的几种设计模式非常的简单,所以,我直接都是代码表示

这篇我会多做些解释,其实并没有这么复杂,大家往下看

(1)抽象工厂

抽象工厂:这个抽象工厂其实很简单,你可以这样想,我这个工厂可以制造很多种汽车,可以发明改造的各种汽车,生产新品

(2)抽象1工厂

抽象1工厂:第一个抽象工厂继承抽象工厂,大家可以理解为,我这个工厂学习继承了抽象工厂的方法,我也会造汽车了,但是我在这个基础的理念上,进行了改造,所以有了奥迪汽车,然后时间日结月累,我会制造q3,q5,a4,a4L,a6,a7,a8等等系列的奥迪车

同上:我还能在这基础上发明,宝马:320,x1,x3,x5等等

(3)抽象2工厂

抽象2工厂:第二个抽象工厂跟抽象1工厂类似

(4)抽象产品1

抽象产品:抽象产品,也就是我们的汽车,拥有一般汽车的共性,比如:能开,能跑,能放音乐等

(5)具体产品

具体产品:具体产品,那就是实际生产的了,比如,一系列的车,对吧,可能刚开始的车,只能跑

1.第一代车(敞篷车)拖拉机吧,哈哈
2.第二代车:有玻璃门和天窗
3.第三代车:有内外反光镜
4.第四代车:能放音乐导航

..
.
这也就是所谓的多种系列,当然以上纯属举例,切勿当真

以上对类图UML做了详细的解释,相信这样大家理解起来,应该非常简单吧

代码演示

上面我们已经很清晰的明白了他们之间的关系,所以接下来就用代码演示,将上面我们的想法和逻辑用代码表现出来:

我们都知道,其实汽车厂,制造汽车没这么简单,说造好就造好了,汽车厂,肯定会制造一些列的东西,然后在组装,比如:

1.轮子
2.发动机
3.外壳
4.反光镜


.
(1)抽象车工厂

package com.zengtao.demo.absfactory;

/**
 * 抽象车工厂
 */
public abstract class AbstractFactory {

    public abstract ITire tireType();

    public abstract IEngine engineType();

    public abstract void create();

}

(2)具体工厂奥迪Q3

package com.zengtao.demo.absfactory;

/**
 * 奥迪q3工厂
 */
public class AudiQ3Factory extends AbstractFactory {

    @Override
    public ITire tireType() {
        return new SkidTire();
    }

    @Override
    public IEngine engineType() {
        return new NormalEngine();
    }

    @Override
    public void create() {
        System.out.println("奥迪Q3已生产!");
    }

}

(3)具体工厂奥迪Q7

package com.zengtao.demo.absfactory;

/**
 * 奥迪q7工厂
 */
public class AudiQ7Factory extends AbstractFactory {

    @Override
    public ITire tireType() {
        return new PlainTire();
    }

    @Override
    public IEngine engineType() {
        return new HeightEngine();
    }

    @Override
    public void create() {
        System.out.println("奥迪Q7已生产!");
    }

}

(4)抽象轮胎

package com.zengtao.demo.absfactory;

/**
 * 抽象轮胎
 */
public interface ITire {

    void tireType();

}

(5)具体轮胎

5.1 防滑轮胎

package com.zengtao.demo.absfactory;

/**
 * 防滑轮胎
 */
public class SkidTire implements ITire {

    @Override
    public void tireType() {
        System.out.println("防滑轮胎,雨天专备");
    }

}

5.2 越野轮胎

package com.zengtao.demo.absfactory;

/**
 * 越野轮胎
 */
public class PlainTire implements ITire {

    @Override
    public void tireType() {
        System.out.println("越野轮胎,旅途专备");
    }

}

(6)抽象发动机

package com.zengtao.demo.absfactory;

/**
 * 抽象发动机
 */
public interface IEngine {

    void engineType();

}

(7)具体发动机

7.1 普通发动机

package com.zengtao.demo.absfactory;

/**
 * 普通发动机
 */
public class NormalEngine implements IEngine {

    @Override
    public void engineType() {
        System.out.println("国产,普通发动机");
    }

}

7.2 德国进口发动机

package com.zengtao.demo.absfactory;

/**
 * 高配置发动机
 */
public class HeightEngine implements IEngine {

    @Override
    public void engineType() {
        System.out.println("德国进口,高配置发动机");
    }

}

(8)调用

package com.zengtao.demo;

import com.zengtao.demo.absfactory.AudiQ3Factory;
import com.zengtao.demo.absfactory.AudiQ7Factory;

public class Main {

    public static void main(String[] str) {

        AudiQ3Factory audiQ3Factory = new AudiQ3Factory();
        audiQ3Factory.engineType().engineType();
        audiQ3Factory.tireType().tireType();
        audiQ3Factory.create();

        System.out.println();

        AudiQ7Factory audiQ7Factory = new AudiQ7Factory();
        audiQ7Factory.engineType().engineType();
        audiQ7Factory.tireType().tireType();;
        audiQ7Factory.create();
    }
}

(9)结果

这里写图片描述

ok,到这里,我们就将抽象工厂模式用简单的例子给展现了出来,仔细的看下来,其实也就是那这样了,但是不难看出,该设计模式,有很大的问题,不知道各位同学发现没有,那就是每当我们对于的发动机有新款,轮胎有新款,又要重新创建n多类,导致类不停的增多,当真是可怕。。。

总结

当然,每一种设计模式既然存在,就有存在的道理,但是该何时采用,却需要谨慎考虑,解析来总结下抽象工厂模式的优缺点

优点

明显的优点就是,分离了接口和实现,该方法中,返回的是接口,如ITired,面向的是接口编程,具体实现到具体类去做处理,切换产品类时,比较灵活

缺点

缺点也很明显,就是会导致类不停的爆增,第二个是扩展新的产品类,新增的话抽象工厂修改,然后一路修改下来,工作量非常大,一增全改,然后就发现要爆炸了。。。

当然抽象工厂模式在Android中的使用,大家可以去看看,你继承Service 服务的时候,会复写onBind方法,也是面向IBinder接口的吧,如果想了解更多,可以具体去看看

郑重申明:使用设计模式的时候,需要谨慎,有些时候,直接的编码,或许也能更直观的表明和实现,反之有些时候,设计模式,能完美优雅的解决问题

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值