设计模式篇---抽象工厂(包含优化)

这篇具有很好参考价值的文章主要介绍了设计模式篇---抽象工厂(包含优化)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概念

抽象工厂:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。
工厂方法是有一个类型的产品,也就是只有一个产品的抽象类或接口,而抽象工厂相对于工厂方法来说,是有n个类型的产品,也就具有n个产品的抽象类或接口。通俗的来讲,就是由生成一个类型的产品转变为生成一组产品,这是二者的主要区别,两个的相同点是抽象的工厂接口里关联的永远是抽象的产品。

结构

抽象工厂的类图如下:
设计模式篇---抽象工厂(包含优化),设计模式,设计模式
AbstractFactory(抽象工厂):它声明了一组用于创建一族产品的方法,每一个方法对应一种产品(抽象的产品)。
ConcreteFactory(具体工厂):它实现了在抽象工厂中声明的创建产品的方法,生成一组具体产品。
AbstractProduct(抽象产品):它为每种产品声明接口,在抽象产品中声明了产品所具有的业务方法。
ConcreteProduct(具体产品):它定义具体工厂生产的具体产品对象,实现抽象产品接口中声明的业务方法。

实例

现在有海尔和海信两家公司,都会生产电视和空调,根据这种场景,我们可以拆分一下,把电视和空调作为产品族,海尔和海信两家公司作为两个生产产品的抽象工厂,它们都可以生产电视和空调。

空调的抽象产品:

public interface HVAC {
    void displayHVAC();
}

海尔空调:

public class HaierHVAC implements HVAC {

    @Override
    public void displayHVAC() {
        System.out.println("海尔空调");
    }
}

海信空调:

public class HisenseHAVC implements HVAC{
    @Override
    public void displayHVAC() {
        System.out.println("海信空调");
    }
}

电视的抽象产品:

public interface TV {
    void displayTV();
}

海尔电视:

public class HaierTV implements TV{
    @Override
    public void displayTV() {
        System.out.println("海尔电视");
    }
}

海信电视:

public class HisenseHAVC implements HVAC{
    @Override
    public void displayHVAC() {
        System.out.println("海信空调");
    }
}

抽象的工厂,海信工厂和海尔工厂实现该接口:

public interface AbstractFactory {

    TV createTV();

    HVAC createHVAC();
}

海尔工厂:

public class HaierFactory implements AbstractFactory{
    @Override
    public TV createTV() {
        return new HaierTV();
    }

    @Override
    public HVAC createHVAC() {
        return new HaierHVAC();
    }
}

海信工厂:

public class HisenseFactory implements AbstractFactory {
    @Override
    public TV createTV() {
        return new HisenseTV();
    }

    @Override
    public HVAC createHVAC() {
        return new HisenseHAVC();
    }
}

客户端实现:

public class Client {

    public static void main(String[] args) {
        //创建海尔的空调和电视
        AbstractFactory haierFactory = new HaierFactory();
        TV haierTV = haierFactory.createTV();
        HVAC haierHVAC = haierFactory.createHVAC();
        haierTV.displayTV();
        haierHVAC.displayHVAC();
    }
}

结果:
设计模式篇---抽象工厂(包含优化),设计模式,设计模式

优化

抽象工厂比工厂方法多了一个产品族的抽象,也就是可以在工厂里创建多个产品。当新的公司介入时,如长虹公司也来了,那就在实现一个长虹公司的工厂,实现抽象工厂,然后重写里面的方法即可。
但是假如海尔和海信不仅仅生产空调和电视了,还想生产冰箱,那就需要再增加一个产品,这时,海尔和海信工厂都需要增加一个生产冰箱的方法,假如有n个像海尔和海信这样的工厂,那每个工厂都需要重写方法,很难扩展。

于是我苦思冥想,终于想到了一个方案,先说下思路:
1、因为当扩展新的产品时,就要重写工厂的方法,所以这个工厂里,我打算只放一个获取产品的方法,返回类型是一个抽象的产品。
2、要实现完全的开闭原则不太现实,只能减少对原有类的影响,要改的话只改动一个类就好,所以可以把需要变动的地方都放到一个类中,需要变动的点就是扩展新的产品。
3、因为客户面向的是抽象,所以在客户端不能出现具体的产品,只能出现抽象产品,但是可以通过字符串的形式进行传参,这样与每个类都没有耦合。
4、因为海尔和海信的工厂是固定的,可以在里面出现魔法值。

下面是优化的效果:
抽象工厂类,只有一个抽象的方法:

public interface AbstractFactory {
    Product create(String type);
}

海尔工厂类,可通过反射获取具体的产品:

public class HaierFactory implements AbstractFactory {

    @Override
    public Product create(String type) {
        Map<String, String> productClassNameByType = ExtendUtil.getProductClassNameByType(type);

        String className = productClassNameByType.get("haier");

        Object o = null;
        try {
            o = Class.forName(className).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (Product) o;
    }
}

海信工厂类:

public class HisenseFactory implements AbstractFactory {
    @Override
    public Product create(String type) {
        Map<String, String> productClassNameByType = ExtendUtil.getProductClassNameByType(type);
        String className = productClassNameByType.get("hisense");
        Object o = null;
        try {
            o = Class.forName(className).newInstance();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return (Product) o;
    }
}

一个工具类,用来扩展使用,存放产品族和具体产品之间的关系:

public class ExtendUtil {

    private static Map<String, Map<String, String>> map = new HashMap<>();

    static {
        map = new HashMap<String, Map<String, String>>() {{
            Map<String, String> tvMap = new HashMap<>();
            tvMap.put("haier", "com.tfjybj.ming.design.absfactory.HaierTV");
            tvMap.put("hisense", "com.tfjybj.ming.design.absfactory.HisenseTV");
            put("tv", tvMap);


            Map<String, String> hvacMap = new HashMap<>();
            hvacMap.put("haier", "com.tfjybj.ming.design.absfactory.HaierHVAC");
            hvacMap.put("hisense", "com.tfjybj.ming.design.absfactory.HisenseHVAC");
            put("hvac", hvacMap);
        }};
    }


    public static Map<String,String>  getProductClassNameByType(String type){
        return map.get(type);
    }
}

最抽象的产品:

public interface Product {
    void display();
}

海尔电视:

public class HaierTV implements Product {
    @Override
    public void display() {
        System.out.println("海尔电视");
    }
}

海尔空调:

public class HaierHVAC implements Product {

    @Override
    public void display() {
        System.out.println("海尔空调");
    }
}

海信电视:

public class HisenseTV implements  Product {
    @Override
    public void display() {
        System.out.println("海信电视");
    }
}

海信空调:

public class HisenseHAVC implements Product{

    @Override
    public void display() {
        System.out.println("海信空调");
    }
}

客户端使用:

public class Client {

    public static void main(String[] args) {
        //创建海尔的空调和电视
        AbstractFactory haierFactory = new HaierFactory();

        //客户端面向的是抽象
        Product tv = haierFactory.create("tv");
        Product hvac = haierFactory.create("hvac");
        tv.display();
        hvac.display();

    }
}

如果增加新的产品如冰箱,或者新增工厂如长虹电器,则需要改动的地方只有这里:
设计模式篇---抽象工厂(包含优化),设计模式,设计模式
欢迎您的观看,有问题一起探讨。文章来源地址https://www.toymoban.com/news/detail-660545.html

到了这里,关于设计模式篇---抽象工厂(包含优化)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式 - 抽象工厂模式

    学完工厂模式,才发现还有一个抽象工厂模式;学习后发现不论是通过接口方式、还是继承方式,都可以使用抽象工厂模式;但是个人建议更多的时候,我们可以优先考虑接口方式,毕竟 单继承,多实现 设计模式分为三种类型,共23种 创建型模式:单例模式、工厂模式、抽

    2024年02月13日
    浏览(45)
  • 设计模式(3)抽象工厂模式

    一、介绍: 1、定义:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 2、组成结构: (1)抽象工厂角色:担任这个角色的是工厂方法模式的核心,它是与应用程序无关的。任何在模式中创建对象的工厂类必须实现这个接口。 (2)具体工厂角色

    2024年02月11日
    浏览(53)
  • 重温设计模式 --- 抽象工厂模式

    抽象工厂模式 一种创建型设计模式,它提供了一种方式来封装一组具有相同主题的工厂,而不必指定它们具体的类。这样,客户端代码就可以使用抽象工厂来创建一组相关的对象,而不必关心实际创建的具体类。 抽象工厂模式有以下几个主要角色: 抽象工厂(AbstractFactory)

    2024年02月13日
    浏览(49)
  • 设计模式(三):抽象工厂模式

    抽象工厂模式 (Abstract Factory Pattern)属于创建型模式,是围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。 在 抽象工厂模式 中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。 通过使用 抽

    2024年04月25日
    浏览(40)
  • 【设计模式专题之抽象工厂模式】3. 家具工厂

    题目描述 小明家新开了两个工厂用来生产家具,一个生产现代风格的沙发和椅子,一个生产古典风格的沙发和椅子,现在工厂收到了一笔订单,请你帮他设计一个系统,描述订单需要生产家具的信息。 输入描述 输入的第一行是一个整数 N(1 ≤ N ≤ 100),表示订单的数量。

    2024年03月12日
    浏览(51)
  • 结构型设计模式-单例模式/工厂模式/抽象工厂

    创建型设计模式-单例模式/工厂模式/抽象工厂 行为型设计模式:模板设计模式/观察者设计模式/策略设计模式 C#反射机制实现开闭原则的简单工厂模式 设计模式可以分为三种类型: 创建型设计模式、结构型设计模式和行为型设计模式 。 创建型设计模式:这些模式涉及到 对

    2024年02月11日
    浏览(53)
  • 设计模式-创建型模式-抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。抽象工厂模式又称为Kit模式,它是一种对象创建型模式。 由于工厂方法模式中的每个工厂只生产一类产品,可能会导致系统中存在大量的工厂类,势必会增加系

    2024年02月22日
    浏览(53)
  • [设计模式]创建型模式-抽象工厂模式

    抽象工厂模式是一种创建型设计模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式将一组具有共同主题的单个工厂封装起来,它提供接口用于创建相关或依赖对象的家族,而不需要指定具体的类。 抽象工厂模式包含以下几个

    2024年03月08日
    浏览(41)
  • 设计模式之抽象工厂模式笔记

    记录下学习设计模式-抽象工厂模式的写法。 意图 :提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 结构 : 其中: AbstractFactory声明一个创建抽象产品对象的操作接口。 ConcreteFactory实现创建具体产品对象的操作。 AbstractProduct为一类产品对象声明一

    2024年02月09日
    浏览(39)
  • [设计模式] 抽象工厂模式简易案例

    定义:提供一个接口来创建一系列相关或依赖对象,而无需指定其具体类。 痛点:当需要创建一组相关对象,例如操作系统的不同界面组件(按钮、文本框等)时,抽象工厂模式非常有用。 以下是一个简单的抽象工厂模式的 Java 示例,假设你要创建不同类型的按钮和窗口组

    2024年02月09日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包