首页 > 其他分享 >创建型设计模式:工厂方法、简单工厂、抽象工厂

创建型设计模式:工厂方法、简单工厂、抽象工厂

时间:2023-07-30 23:45:57浏览次数:41  
标签:void 工厂 抽象 Override 手机 设计模式 public

1. 前言

设计模式,对于像java这种面向对象的语言来说,个人感觉是比较重要的。尤其在构建大型项目,设计模式的优点不言而喻。那么设计模式是什么?解决了软件工程中的什么问题?要想学一门东西,学一个知识点,我觉得首先得了解这个东西(知识、技术)它解决了什么问题,如果没有这门技术,那之前的做法是什么(历史)。

设计模式(Design Patterns)是软件工程中用于解决常见问题的通用设计和编程方法。它通常以对象和类为中心,通过抽象化来解决在软件设计中反复出现的某类问题。

设计模式大多依赖于面向对象编程中的一些概念和机制,如继承、多态、封装等,这些是面向对象语言的特性。而过程化语言如C语言,则缺乏这些面向对象的特性,所以应用设计模式比较困难,而java这种语言就非常适合使用设计模式来完成对代码的编写。
我觉得使用设计模式来进行编码,其实就是为了“让维护代码的后来者同事的心情更好”,总比那种if else不断的,不写注释的,写了那种让人懵逼的注释的强些。至少在结构上是清晰的,让人有一丝清爽感,而不是漫无天际的堆砌代码,一个类中的一个方法给你整上千行(被这样的代码整怕了@dog狗头)。

设计模式的主要优点就是:

  • 代码复用性高,可重用已有的设计和代码。
  • 可维护性好,各部分职责明确。
  • 扩展性好,可按需扩展部分功能。
  • 低耦合度,降低模块之间的依赖性。

学习设计模式可能需要了解的知识:

  1. 类图
    类图中6种关系,继承、实现、关联、依赖、组合、聚合。http://ytvz.cn/6thsqI

2. 工厂方法模式

上面说学一门知识就要先了解它解决的问题,以及它的历史。那么,在学设计模式的时候,我觉得首先得弄清这个设计模式解决了什么问题(作用、应用场景)

工厂方法模式的作用:简单的理解就是创建对象。

名字就已经可以看出端倪,工厂它就是生产各种产品的地方。在OOP的语言中,对象其实就可以理解为产品(对象中封装了各种属性和功能,和现实中的产品对比是差不多,比如手机这个产品它有规格spec【摄像头像素、电池容量等等】,它也有功能【打电话、发短信等等】)。既然其作用就是为了创建对象,所以它是属于创建型的设计模式,当然简单工厂、抽象工厂都属于创建型。

相信java 程序员,尤其是web开发都接触使用过 spring 框架。我们大都是在业务处理类上标注@Service注解使之成为spring的一个Bean对象。springBeanFactory接口其实就是工厂模式实现的,就是为了实例化一个一个的Bean,它隐藏了bean的实例化和生命周期管理细节,给上层应用提供了简单的bean使用方法。

从一个简单的小例子出发,体验一下工厂方法设计模式:

/**
 * 手机产品接口
 */
public interface Phone {

    /**
     * 发短信
     */
    void sendMsg();

    /**
     * 听音乐
     */
    void listenMusic();

    /**
     * 上网
     */
    void internetSurf();
}
/**
 * 华为手机实现
 */
public class HuaWeiPhone implements Phone {
    @Override
    public void sendMsg() {
        System.out.println("华为手机发短信");
    }

    @Override
    public void listenMusic() {
        System.out.println("华为手机听音乐");
    }

    @Override
    public void internetSurf() {
        System.out.println("华为手机上网");
    }
}

/**
 * 苹果手机实现
 */
public class ApplePhone implements Phone{
    @Override
    public void sendMsg() {
        System.out.println("苹果手机发短信");
    }

    @Override
    public void listenMusic() {
        System.out.println("苹果手机听音乐");
    }

    @Override
    public void internetSurf() {
        System.out.println("苹果手机上网");
    }
}
/**
 * 抽象手机工厂
 */
public abstract class AbstractPhoneFactory {

    /**
     * 生产手机对象的泛型方法
     * 用 extends 协变,来标明返回类型必须是 Phone 或其子类
     * @param clazz
     * @param <T>
     * @return
     */
    protected abstract <T extends Phone> T createPhone(Class<T> clazz);

}

/**
 * 具体的手机工厂类
 */
public class PhoneFactory extends AbstractPhoneFactory {

    /**
     * 具体的生产手机这个对象的方法
     *
     * @param clazz
     * @param <T>
     * @return
     */
    @Override
    protected <T extends Phone> T createPhone(Class<T> clazz) {
        try {
            return (T) Optional.ofNullable(Class.forName(clazz.getName()).newInstance()).orElse(null);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

public class Client {
    public static void main(String[] args) {
        AbstractPhoneFactory factory = new PhoneFactory();
        // 由具体的类决定实例化的对象
        // 就是为了生产对象
        Phone huaWeiPhone = factory.createPhone(HuaWeiPhone.class);
        huaWeiPhone.sendMsg();
        huaWeiPhone.listenMusic();
        huaWeiPhone.internetSurf();
        //华为手机发短信
        //华为手机听音乐
        //华为手机上网
    }
}

标签:void,工厂,抽象,Override,手机,设计模式,public
From: https://www.cnblogs.com/hkz329/p/17592214.html

相关文章

  • 何为多态——和抽象又有什么关系
    到底什么是多态?面向对象三大特征:封装、继承、多态前面两个应该比较好理解,顾名思义,那最后这个多态到底是什么?我最近也看了一些相关的文章,但是可能因为水平尚浅,不是很能理解所以想自己总结一下,不一定完全正确,欢迎大家提出意见我认为多态这两个字,可以解释为多个形态多态其实是建......
  • 设计模式-迭代器模式在Java中使用示例
    场景为开发一套销售管理系统,在对该系统进行分析和设计时,发现经常需要对系统中的商品数据、客户数据等进行遍历,为了复用这些遍历代码,开发人员设计了一个抽象的数据集合类AbstractObjectList,而将存储商品和客户等数据的类作为其子类AbstractObjectList类的子类ProductList和Custo......
  • 抽象类 vs 接口【概念解析系列_2】【C# 基础】
    〇、前言抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。一、简介与示例1.1抽象类抽象类就是不能使用new方法进行实例化的类,即没有具体实例对象的类。抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的类,对象不能由抽象类直接创......
  • SAP Fiori Elements 应用里的 visitor 访问者设计模式
    SAPFioriElements应用SmartTabletitle控件的text属性,在运行时如何生成的?在TitleRenderer.js里设置断点:调用getText拿到textproperty值:问题是这个Text属性是从哪里来的?在SmartTable.js内部能够观察到这个Products字符串:最终的入口还是XMLTemplate......
  • Java设计模式-策略模式
    简介策略模式是指有一定行动内容的相对稳定的策略名称,策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法经验总结抽象策略角色:策略类,通常由一个接口或者抽象类实现具体策略角色:包装了相关的算法和行为环境角色:持有一个策略类的引用,最终给客......
  • 设计模式-备忘录模式在Java中使用示例-象棋悔棋
    场景备忘录模式备忘录模式提供了一种状态恢复的实现机制,使得用户可以方便地回到一个特定的历史步骤,当新的状态无效或者存在问题时,可以使用暂时存储起来的备忘录将状态复原,当前很多软件都提供了撤销(Undo)操作,其中就使用了备忘录模式。备忘录模式结构图 在备忘录模式结构......
  • 设计模式-中介者模式在Java中使用示例-客户信息管理
    场景欲开发客户信息管理窗口界面,界面组件之间存在较为复杂的交互关系:如果删除一个客户,要在客户列表(List)中删掉对应的项,客户选择组合框(ComboBox)中客户名称也将减少一个;如果增加一个客户信息,客户列表中需增加一个客户,且组合框中也将增加一项。中介者模式概述如果在一个系统......
  • 虚函数与抽象函数
    虚函数是有代码的并明确允许子类去覆盖,但子类也可不覆盖,就是说可以直接用,不用重写  //虚方法,必须声明主体(默认方法体)可重写可不重写。publicclassA{publicvirtualvoida(){Console.WriteLine("虚函数a");}......
  • 设计模式-桥接模式
    桥接模式(Bridge)模式定义+将抽象部分和实现接口分离,使它们可以独立变化。是一种结构性模式。UML图时序图角色定义抽象类(Abstraction)用于定义抽象类的接口,其中定义了一个Implementation实现类接口的对象,并可以维护该对象,它与Implementation具有关联关系扩充抽象......
  • 2023.7.28 周五:抽象类 abstract
    1//不能new抽象类,只能依靠子类去重写来实现2//抽象类中可以写普通方法3//抽象方法必须写在抽象类中4//5//person6packagecom.mu.www;78publicabstractclassPerson{//抽象类9publicabstractvoiddoSth();//抽象方法,只有方法名字,没有方法的实......