简单工厂、工厂方法和抽象工厂的区别

工厂模式一般分为简单工厂、工厂方法和抽象工厂三种,看了很多资料,好多讲的都是云里雾里的。要么是概念太多,让人看得一脸懵逼,要么是举得例子不太恰当,看了更让人迷惑了。经过自己一番研究,通过一个简单的例子,终于搞明白了它们之间的区别。

下面以生产宝马、奔驰汽车的工厂为例,讲解它们之间的区别。

一、简单工厂模式

创建一个工厂类,根据传入的参数来决定创建哪个汽车类

//汽车接口
public interface Car {
    void getCar();
}
//宝马汽车类
public class BMWCar implements Car {
    @Override
    public void getCar() {
        System.out.println("这是宝马车");
    }
}
//奔驰汽车类
public class BenzCar implements Car {
    @Override
    public void getCar() {
        System.out.println("这是奔驰车");
    }
}
//工厂类,用于决定创建哪一个具体的汽车类
public class DefaultFactory {
    public Car produce(String name){
        if(name.equals("benz")){
            return new BenzCar();
        }else if(name.equals("bmw")){
            return new BMWCar();
        }
        return null;
    }
}

public class FTest {
    public static void main(String[] args) {
        DefaultFactory factory = new DefaultFactory();
        Car car = factory.produce("bmw");
        car.getCar(); //这是宝马车

        Car benz = factory.produce("benz");
        benz.getCar();  //这是奔驰车
    }
}

可以看到,在具体的工厂类DefaultFactory中,我们根据传入的name来决定创建哪一个汽车类。当需要创建宝马时,传入bmw,当需要创建奔驰时传入benz。思考一下,如果我需要创建一个大众汽车呢。是不是需要创建一个大众汽车类实现Car接口,还需要修改工厂类的produce方法,新增一个大众的分支。 再回忆一下,之前讲过的软件六大设计原则之一开闭原则。很明显,这违背了开闭原则(对修改是关闭的)。

于是,有了下边的工厂方法,可以保证遵循开闭原则。

二、工厂方法模式

工厂方法,相比于简单工厂,多了一个角色——工厂接口,负责定义生产汽车的公共接口,然后每个工厂实现类都去实现这个接口。

//工厂接口
public interface IFactory {
    Car produce();
}
//宝马生产工厂
public class BMWFactory implements IFactory{
    @Override
    public Car produce() {
        return new BMWCar();
    }
}
//奔驰生产工厂
public class BenzFactory implements IFactory {
    @Override
    public Car produce() {
        return new BenzCar();
    }
}

public class FacTest {
    public static void main(String[] args) {
        BMWFactory bmwFactory = new BMWFactory();
        bmwFactory.produce().getCar();   //这是宝马车

        BenzFactory benzFactory = new BenzFactory();
        benzFactory.produce().getCar();  //这是奔驰车
    }
}

可以看到,我把之前的一个工厂,拆分为两个工厂。当具体需要哪个汽车的时候,就去实例化它对应的工厂。这样,当再需要大众车的时候,我只需要添加一个大众车的类和大众车对应的工厂实现类去实现IFactory接口就可以了。不需要修改原来的代码,这就符合开闭原则了。

三、 抽象工厂模式

初识抽象工厂的同学,总是很迷惑它和工厂方法有什么区别,不就是在工厂实现类里多了几个方法吗。其实,抽象工厂是对工厂方法的升级,用于创建一组相互关联或相互依赖的对象。

在此需要了解一下产品等级和产品族的关系。假如有一个汽车制造商,它只生产低配版的汽车产品(至于为什么,我猜是低配版更亲民,销量更高吧,哈哈),其中就包括低配宝马和低配奔驰。还有一个汽车制造商只生产高配版的汽车(没什么原因,就是钱多任性,高端大气上档次),如高配宝马和高配奔驰。

我们就把高配制造商或者低配制造商称为一个产品族。而其中的低配宝马和低配奔驰属于同一个产品等级,高配宝马和高配奔驰属于同一个产品等级。

画一张图来理解一下它们的概念,横向是三个产品族,纵向是两个产品等级。

代码如下:

//工厂接口,包含两个方法,创建宝马和创建奔驰
public interface IFactory {
    Car produceBMW();
    Car produceBenz();
}
//-------- 高配车和工厂实现类 -------//
public class HighBMW implements Car {
    @Override
    public void getCar() {
        System.out.println("高配宝马车");
    }
}
public class HighBenz implements Car {
    @Override
    public void getCar() {
        System.out.println("高配奔驰车");
    }
}
public class HighFactory implements IFactory {
    @Override
    public Car produceBMW() {
        return new HighBMW();
    }

    @Override
    public Car produceBenz() {
        return new HighBenz();
    }
}
//-------- 低配车和工厂实现类 ----------//
public class LowBMW implements Car {
    @Override
    public void getCar() {
        System.out.println("低配宝马车");
    }
}
public class LowBenz implements Car {
    @Override
    public void getCar() {
        System.out.printf("低配奔驰车");
    }
}
public class LowFactory implements IFactory {
    @Override
    public Car produceBMW() {
        return new LowBMW();
    }

    @Override
    public Car produceBenz() {
        return new LowBenz();
    }
}

public class AbsTest {
    public static void main(String[] args) {
        HighFactory highFactory = new HighFactory();
        highFactory.produceBMW().getCar();  //高配宝马车
        highFactory.produceBenz().getCar();  //高配奔驰车

        LowFactory lowFactory = new LowFactory();
        lowFactory.produceBMW().getCar();  //低配宝马车
        lowFactory.produceBenz().getCar();  //低配奔驰车
    }
}

乍一看,抽象工厂和工厂方法特别的相似,其实这里边就是多了一个产品族的概念,它强调一个产品族的对象应该放到同一个工厂类里边。比如,我再需要一个中配版或者豪华版的汽车制造商,只需要实现它的具体工厂类和相应的各同等级的汽车类。

总结:

  1. 简单工厂顾明思议,实现比较简单,只需要传入一个特定参数即可,不用知道具体的工厂实现类名,缺点就是违背了开闭原则。
  2. 工厂方法和抽象工厂,遵守开闭原则,解耦了类关系。但是,扩展比较复杂,需要增加一系列的类。
  3. 需要注意,工厂方法和抽象工厂的区别就在于,抽象工厂关注于某一个产品族,当产品对象之间是有关联关系的一个产品族时用这种方式,而工厂方法没有产品族的概念。

原文地址:https://www.cnblogs.com/starry-skys/p/12104271.html

时间: 2024-08-10 06:12:52

简单工厂、工厂方法和抽象工厂的区别的相关文章

设计模式系列---简单工厂、工厂方法、抽象工厂

前言,最近看spring的源代码.发现之前没有完全弄懂(工厂方法.抽象工厂)的区别. spring中代理对象的产生,是通过代理工厂(工厂模式),首先spring中的代理是使用jdk或者cglib的代理,只要看目标类是否实现接口. public class ProxyFactory extends ProxyCreatorSupport { //createAopProxy()方法是通过AopProxyFactory获取AopProxy(JDK,CGLIB) public Object getPr

【转】设计模式:简单工厂、工厂方法、抽象工厂之小结与区别

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

结合简单示例和UML图,讲解工厂模式简单原理. 一.引子 话说十年前,有一个爆发户,他家有三辆汽车(Benz(奔驰).Bmw(宝马).Audi(奥迪)),还雇了司机为他开车.不过,爆发户坐车时总是这样:上Benz车后跟司机说"开奔驰车!",坐上Bmw后他说"开宝马车!",坐上 Audi后他说"开奥迪车!".你一定说:这人有病!直接说开车不就行了?!而当把这个爆发户的行为放到我们程序语言中来,我们发现C语言一直是通过这种方式来坐车的!幸运的是这种有

简单工厂、工厂方法与抽象工厂大比拼

简单工厂.工厂方法和抽象工厂都属于设计模式创建型,严格意义上简单工厂不属于23设计模式之一(违背了开闭原则),本文为了完整描述三工厂演变过程,对三工厂进行了整体的总结和学习,并通过三者之间的特点比较总结出各自的优缺点. 一.简单工厂: 在没有工厂之前,大家都是自给自足,生产一部车或其他工具都是自己来完成,有了工厂之后,告诉它需求就会出来相应的产品,但生产化水平比较低,工厂分工不太明确,社会上只有一个工厂,不论卡车还是公交车都由它来完成,相当于一个工厂多条生产线. 类图: 代码: /*******

设计模式:简单工厂、工厂方法、抽象工厂之小结与区别 (转)

简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他们之间的区别的理解. 简单工厂 简单工厂模式的工厂类一般是使用静态方法,通过接收的参数的不同来返回不同的对象实例. 不修改代码的话,是无法扩展的. 工厂方法 工厂方法是针对每一种产品提供一个工厂类.通过不同的工厂实例来创建不同的产品实例. 在同一等级结构中,支持增加任意产品. 抽象工厂 抽象工厂是应

重头开始学23种设计模式:三大工厂(简单工厂,工厂方法,抽象工厂)

在开发当中我们经常会使用三个设计模式,来帮我们解决项目代码的可扩展性. 在简单工厂,工厂方法,抽象工厂这三个设计模式当中,代码其实都很简单,主要是要理解运用. 简单工厂: 简单工厂说白了,就是利用Switch根据传递的参数,进行实例化. 工厂方法: 工厂方法,为解决每次都去增加Swicth的简单工厂的升级.为每一个产品提供一个工厂类. 抽象工厂: 抽象工厂,我觉得也是对工厂方法的再次升级,工厂方法每次只能创作一个产品,而抽象工厂就是产品线的产品族. 总结下,从网上找到一个大牛的回复: 我认为不能

简单工厂、工厂方法、抽象工厂之小结、区别

很多时候,我发现这三种设计模式难以区分,常常会张冠李戴闹了笑话.很有必要深入总结一下三种设计模式的特点.相同之处和不同之处. 1 本质 三个设计模式名字中都含有“工厂”二字,其含义是使用工厂(一个或一系列方法)去生产产品(一个或一系列类的实例). 另外,有时候,我们常常会将生产产品的一个或一系列方法封装到一个类中,我习惯把这个类叫做“工厂类”:而被实例化的类称作“产品类”. 2 简单工厂 工厂类(SimpleFactory)拥有一个工厂方法(create),接受了一个参数,通过不同的参数实例化不

简单工厂、工厂方法、抽象工厂区别

设计模式:简单工厂.工厂方法.抽象工厂之小结与区别 大话设计模式之简单工厂模式.抽象工厂模式及工厂方法模式的比较 抽象工厂模式-与-工厂方法模式区别 在简单工厂模式下,工人要想到种植萝卜还是白菜,在工厂模式下,工人想到是种植根菜还是茎菜,而在抽象工厂模式下,则关心种植基因菜还是非基因菜

大话设计模式之简单工厂模式&工厂方法模式&抽象工厂模式

创造类模式分为三种:简单工厂模式,工厂模式和抽象工厂模式. 定义: 简单工厂模式:用一个单独的类来做创造实例的过程. 工厂模式:一个用于创建对象的接口,让子类决定实例化哪一个类,讲一个类的实例化 延迟到其子类. 抽象工厂模式:为创建一组相关或相互依赖的对象的类,而不指定具体类. 结构图: 这是简单工厂的结构图,从图中就很好理解. 简单工厂的优点: 根据用户需要,new出需要的对象. 但是简单工厂弊端: 当新加入一个功能是,就要修改工厂.这个时候,就需要工厂模式了. 从图中我们可以看出: 工厂模式

设计模式--简单工厂、工厂方法和抽象工厂

简单工厂.工厂方法和抽象工厂三种设计模式都用来帮助我们将对象的实例化部分抽取出来,优化系统结构,在开发中经常使用.三者既有区别,也有联系,今天来对这三种设计模式做一个简单的记录. 概述 简单工厂:用来生产同一等级结构中的任意产品(对于增加新的产品,需要修改工厂) 工厂方法:用来生产同一等级结构中的固定产品(支持增加新的产品) 抽象工厂:用来生产不同产品族的全部产品(支持增加新的产品族,不支持增加新的产品) 简单工厂 一般来说,利用一个静态方法,即将createProduct方法设置为static