设计模式之抽象工厂模式

0.阐述

工厂方法模式是一类产品的生产,如:畜牧场只养动物,电视机厂只生产电视机。
同种类称为同等级,也就是说工厂方法模式只产生同等级的产品,但现实生活中许多工厂是综合性工厂,能产生多等级的产品,如:农场里既养动物又养植物。小米既生产手机也生产空调、门锁、电视、笔、杯子。
产品族概念图
抽象工厂是生产同一个产品族的不同等级产品


1.定义

抽象工厂模式:是为访问类提供一个创建一组相关或相互依赖的对象接口,且访问类无须指定所要产品的具体类就能得到同族的产品的结构模式。
抽象工厂模式工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。


2.优点与缺点

使用抽象工厂模式一般要满足以下条件。

  • 系统中有多个产品族,每个具体工厂创建同一族但属于不同等级机构的产品。
  • 系统只可能消费其中某一族产品,即同族产品一起使用。

抽象工厂模式除了具有工厂方法模式的优点外,其他主要优点如下。

  • 可以在类的内部对产品族中相关联的多等级产品进行共同管理,而且不必专门引入多个新的类来进行管理。
  • 当增加一个新的产品族时不需要修改源代码,满足开闭原则。

缺点:

  • 当产品族中需要增加一个新的产品时,所有共产类都需要进行修改。

3.实现

模式的结构
抽象工厂模式的主要角色。
1)抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法newProduct(),可以创建多个不同等级的产品。
2)具体工厂(Concrete Factory):主要实现抽象工厂中的多个抽象方法,完成产品的创建。
3)抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
4)具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间是多对多的关系。
抽象工厂模式的结构图


4.示例

以海尔能生产电视和空调,TCL也能生产电视和空调为例。
4.1抽象类
4.1.1抽象工厂类

package ink.poesy.design.AbstractFactoryDesign;

public interface AbstractFactory {
    public Product newProduct1();
    public Product2 newProduct2();
}

4.1.2抽象产品类->空调

package ink.poesy.design.AbstractFactoryDesign;

public interface Product {
    public void show();
}

4.1.2抽象产品类->电视

package ink.poesy.design.AbstractFactoryDesign;

public interface Product2 {
    public void show();
}

额,好像跟空调的一样

4.2海尔
4.2.1海尔的具体工厂

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteFactory implements AbstractFactory {
    @Override
    public Product newProduct1() {
        System.out.println("海尔->生产具体产品·空调·");
        return new ConcreteProduct();
    }

    @Override
    public Product2 newProduct2() {
        System.out.println("海尔->生产具体产品·电视·");
        return new ConcreteProduct2();
    }
}

4.2.2海尔的具体产品类->空调

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteProduct implements Product {
    @Override
    public void show() {
        System.out.println("海尔产出空调");
    }
}

4.2.3海尔的具体产品类->电视

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteProduct2 implements Product2 {
    @Override
    public void show() {
        System.out.println("海尔产出电视");
    }
}

4.3TCL
4.3.1TCL的具体工厂

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteFactory2 implements AbstractFactory {
    @Override
    public Product newProduct1() {
        System.out.println("TCL->空调");
        return new ConcreteProduct21();
    }

    @Override
    public Product2 newProduct2() {
        System.out.println("TCL->电视");
        return new ConcreteProduct22();
    }
}

4.3.2TCL的具体产品类->空调

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteProduct21 implements Product {
    @Override
    public void show() {
        System.out.println("TCL产出空调");
    }
}

4.3.3TCL的具体产品类->电视

package ink.poesy.design.AbstractFactoryDesign;

public class ConcreteProduct22 implements Product2 {
    @Override
    public void show() {
        System.out.println("TCL产出电视");
    }
}

4.4测试
4.4.1海尔测试

package ink.poesy.design.AbstractFactoryDesign;

public class Test {
    public static void main(String[] args) throws Exception {
        AbstractFactory abstractFactory ;
        Product product1;
        Product2 product2;

        //Class<?> concreteFactory = Class.forName("ConcreteFactory");
        //abstractFactory= (AbstractFactory)concreteFactory.newInstance();
        abstractFactory = new ConcreteFactory();
        abstractFactory.newProduct1().show();
        abstractFactory.newProduct2().show();
    }
}

运行效果
海尔抽象类测试
4.4.2TCL测试

package ink.poesy.design.AbstractFactoryDesign;

public class Test {
    public static void main(String[] args) throws Exception {
        AbstractFactory abstractFactory ;
        Product product1;
        Product2 product2;

        //Class<?> concreteFactory = Class.forName("ConcreteFactory");
        //abstractFactory= (AbstractFactory)concreteFactory.newInstance();
        只是修改这里为TCL具体工厂
        abstractFactory = new ConcreteFactory2();
        abstractFactory.newProduct1().show();
        abstractFactory.newProduct2().show();
    }
}

运行结果
TCL抽象工厂测试

5.参考文章

[1].C语言中文网


本文为学习笔记来源整理自网络,如有侵犯留言联系。
以上内容如有争议、指正,留言给我~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

园长的牧歌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值