美文网首页
抽象工厂模式

抽象工厂模式

作者: 执着的逗比 | 来源:发表于2020-04-04 12:35 被阅读0次

本来这篇文章是应该和上一篇文章(工厂模式)一起编排的,但是为了对照23种设计模式,还是分开写吧,因为23种设计模式,我想通过自己的理解,然后总结出23篇文章,当然只是站在我的角度上,如有错误,欢迎指正。

对比于工厂方法模式,在抽象工厂模式中,有一个产品族的概念:所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族,与工厂方法相比较的话:

工厂方法模式 抽象工厂模式
工厂方法模式只有一个抽象产品类 抽象工厂模式能提供多个抽象产品类
工厂方法模式的具体工厂类只能创建一个具体产品类的实例 抽象工厂模式可以创建多个具体产品类的实例

我的理解的话,联想于现实,工厂方法模式,就好比一个工厂,里面只有一个车间,这个车间只负责生产衣服,然后车间又分为很多个生产小组,不同的生产小组负责生产不同品牌的衣服。然后抽象工厂模式,就好比一个工厂,但是它有很多车间,分别负责生产同类型的产品,比较袜子、鞋子、裤子、上衣等,然后一个车间又分为了不同的生产小组,不同的生产小组负责生产不同品牌的对应产品。

不知道我这样理解对不对,下面就用代码实现一下。

我们继续上一篇文章的例子。我们继续来模拟生产车间,车间是分别生产Nike和Adidas品牌的衣服和鞋子。

下面我们先定义Adidas接口,然后有一个show方法。

package factory.abstractfactory.adidas;

public interface Adidas {
    void show();
}

然后创建两个实现Adidas接口的实现类,AdidasClothes和AdidasShoes。

package factory.abstractfactory.adidas;

public class AdidasClothes implements Adidas {

    @Override
    public void show() {
        System.out.println("这是Adidas的衣服");

    }
}

package factory.abstractfactory.adidas;

public class AdidasShoes implements Adidas {
    @Override
    public void show() {
        System.out.println("这是Adidas品牌的鞋子");
    }
}

接着创建Nike接口,然后创建实现Nike接口的NikeClothes和NikeShoes。

package factory.abstractfactory.nike;

public interface Nike {
    void show();
}

package factory.abstractfactory.nike;

public class NikeClothes implements Nike {

    @Override
    public void show() {
        System.out.println("这是Nike的衣服");

    }
}

package factory.abstractfactory.nike;

public class NikeShoes implements Nike {
    @Override
    public void show() {
        System.out.println("这是Nike品牌的鞋子");
    }
}

相比较工厂方法模式,它会生产同类型的多个产品。

创建一个factory接口,然后创建两个实现factory接口的NikeFactory和AdidasFactory实现类。

package factory.abstractfactory.factory;

import factory.abstractfactory.adidas.Adidas;
import factory.abstractfactory.nike.Nike;

public interface Factory {

    Nike buyNick();

    Adidas buyAdidas();
}

package factory.abstractfactory.factory;

import factory.abstractfactory.adidas.Adidas;
import factory.abstractfactory.adidas.AdidasClothes;
import factory.abstractfactory.nike.Nike;
import factory.abstractfactory.nike.NikeClothes;

public class ClothesFactory implements Factory {

    @Override
    public Nike buyNick() {
        return new NikeClothes();
    }

    @Override
    public Adidas buyAdidas() {
        return new AdidasClothes();
    }
}

package factory.abstractfactory.factory;

import factory.abstractfactory.adidas.Adidas;
import factory.abstractfactory.adidas.AdidasShoes;
import factory.abstractfactory.nike.Nike;
import factory.abstractfactory.nike.NikeShoes;

public class ShoesFatory implements Factory{

    @Override
    public Nike buyNick() {
        return new NikeShoes();
    }

    @Override
    public Adidas buyAdidas() {
        return new AdidasShoes();
    }
}

最后模拟顾客买衣服的过程

package factory.abstractfactory;

import factory.abstractfactory.factory.ClothesFactory;
import factory.abstractfactory.factory.Factory;
import factory.abstractfactory.nike.Nike;

public class Customer {

    public static void main(String[] args) {

        Factory factory=new ClothesFactory();
        Nike nike=factory.buyNick();
        nike.show();

    }
}

相比较于工厂方法模式,抽象工厂模式和工厂方法模式这两种模式的具体设计思路还是一样的,只是有了一个产品族的新概念,不过不知道是自己见识短,还是写过的代码太少了,在具体的项目中很难应用这种设计思路,看过很多别人的博客,大家都在说工厂模式,华而不实,很难应用到自己的项目中,因为项目需求和现实中的业务很难一致符合。

相关文章

网友评论

      本文标题:抽象工厂模式

      本文链接:https://www.haomeiwen.com/subject/pcxhphtx.html