java设计模式之工厂模式详解

 更新时间:2024年11月08日 09:30:48   作者:北极熊不在北极  
本文介绍了三种常见的设计模式:简单厂模式、工厂方法模式和抽象工厂模式,简单厂模式通过一个工厂类来生产不同的产品实例,例如同时生产华为和小米手机,工厂方法模式则通过定义一个创建对象的接口,让子类决定实例化哪一个类

一、简单厂模式

一个工厂既代工生产华为手机也生产小米手机。

  • 手机接口类
package com.liuyc.designpattern.factory;

public interface Phone {

    void showInfo();
}
  • 华为手机实现类
package com.liuyc.designpattern.factory;

public class HuaWeiPhone implements Phone{
    @Override
    public void showInfo() {
        System.out.println("华为手机");
    }
}
  • 小米手机实现类
package com.liuyc.designpattern.factory;

public class XiaoMiPhone implements Phone{
    @Override
    public void showInfo() {
        System.out.println("小米手机");
    }
}
  • 生产手机工厂类
package com.liuyc.designpattern.factory.simplefactory;

import com.liuyc.designpattern.factory.Phone;

public class SimpleFactory {

    public static Phone getPhone(String className){
        Phone phone = null;
        try {
            Class<Phone> aClass = (Class<Phone>) Class.forName(className);
            phone = aClass.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return phone;
    }
}
  • 具体使用类
package com.liuyc.designpattern.factory.simplefactory;

import com.liuyc.designpattern.factory.Phone;

public class SimpleFactoryMain {

    public static void main(String[] args) {
        Phone phone = SimpleFactory.getPhone("com.liuyc.designpattern.factory.XiaoMiPhone");
        phone.showInfo();
    }
}

二、工厂方法模式

  • 一个生产手机的工厂接口类
package com.liuyc.designpattern.factory.factorymethod;

import com.liuyc.designpattern.factory.Phone;

public interface PhoneFactory {

    Phone getPhone();
}
  • 具体生产华为手机的工厂
package com.liuyc.designpattern.factory.factorymethod;

import com.liuyc.designpattern.factory.HuaWeiPhone;
import com.liuyc.designpattern.factory.Phone;

public class HuaWeiPhoneFactory implements PhoneFactory {
    @Override
    public Phone getPhone() {
        return new HuaWeiPhone();
    }
}
  • 具体生产小米手机的工厂
package com.liuyc.designpattern.factory.factorymethod;

import com.liuyc.designpattern.factory.Phone;
import com.liuyc.designpattern.factory.XiaoMiPhone;

public class XiaoMiPhoneFactory implements PhoneFactory {
    @Override
    public Phone getPhone() {
        return new XiaoMiPhone();
    }
}
  • 具体使用类
package com.liuyc.designpattern.factory.factorymethod;

import com.liuyc.designpattern.factory.Phone;

public class FactoryMethodMain {

    public static void main(String[] args) {
        PhoneFactory phoneFactory = new XiaoMiPhoneFactory();
        Phone phone = phoneFactory.getPhone();
        phone.showInfo();
    }
}

三、抽象工厂模式

现在,不管是华为也好,小米也好,他们已不满足于只生产手机了,他们也开始造车了,现在有一个“组”的概念了,或者说族。

  • 小车的接口类
package com.liuyc.designpattern.factory;

public interface Car {

    void showInfo();
}
  • 华为汽车
package com.liuyc.designpattern.factory;

public class HuaWeiCar implements Car {
    @Override
    public void showInfo() {
        System.out.println("华为小汽车");
    }
}
  • 小米汽车
package com.liuyc.designpattern.factory;

public class XiaoMiCar implements Car {
    @Override
    public void showInfo() {
        System.out.println("小米汽车");
    }
}
  • 抽象工厂,定义既能生产手机,也是生产汽车
package com.liuyc.designpattern.factory.abstactfactory;

import com.liuyc.designpattern.factory.Car;
import com.liuyc.designpattern.factory.Phone;

public interface AbstractFactory {

    Phone getPhone();

    Car getCar();
}
  • 华为工厂
package com.liuyc.designpattern.factory.abstactfactory;

import com.liuyc.designpattern.factory.Car;
import com.liuyc.designpattern.factory.HuaWeiCar;
import com.liuyc.designpattern.factory.HuaWeiPhone;
import com.liuyc.designpattern.factory.Phone;

public class HuaWeiFactory implements AbstractFactory{
    @Override
    public Phone getPhone() {
        return new HuaWeiPhone();
    }

    @Override
    public Car getCar() {
        return new HuaWeiCar();
    }
}
  • 小米工厂
package com.liuyc.designpattern.factory.abstactfactory;

import com.liuyc.designpattern.factory.*;

public class XiaoMiFactory implements AbstractFactory{
    @Override
    public Phone getPhone() {
        return new XiaoMiPhone();
    }

    @Override
    public Car getCar() {
        return new XiaoMiCar();
    }
}
  • 具体使用
package com.liuyc.designpattern.factory.abstactfactory;

import com.liuyc.designpattern.factory.Car;
import com.liuyc.designpattern.factory.Phone;

public class AbstractFactoryMain {

    public static void main(String[] args) {
        AbstractFactory abstractFactory = new XiaoMiFactory();
        Car car = abstractFactory.getCar();
        Phone phone = abstractFactory.getPhone();
        car.showInfo();
        phone.showInfo();
    }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • SpringBoot @PostConstruct原理用法解析

    SpringBoot @PostConstruct原理用法解析

    这篇文章主要介绍了SpringBoot @PostConstruct原理用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • SpringBoot集成Hera实现分布式应用监控与追踪解决方案

    SpringBoot集成Hera实现分布式应用监控与追踪解决方案

    Hera是一款由美团点评开源的分布式应用监控与追踪系统,专注于解决微服务架构下的性能监控、故障诊断和链路追踪问题,本文给大家介绍了SpringBoot集成Hera实现分布式应用监控与追踪的解决方案,需要的朋友可以参考下
    2026-01-01
  • springboot2.x引入feign踩的坑及解决

    springboot2.x引入feign踩的坑及解决

    这篇文章主要介绍了springboot2.x引入feign踩的坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java读取.properties配置文件的几种方式

    Java读取.properties配置文件的几种方式

    这篇文章主要介绍了Java读取.properties配置文件的几种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • java静态方法里使用spring的注入对象方式

    java静态方法里使用spring的注入对象方式

    本文分析了在使用Spring框架时,静态方法中引用非静态变量导致空指针的问题,并提出了使用`@PostConstruct`注解、`@Value`注解、构造注入和`InitializingBean`接口等解决方案
    2026-04-04
  • Java中Comparator升序降序的具体使用

    Java中Comparator升序降序的具体使用

    本文主要介绍了Java中Comparator升序降序的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Android与iOS设备MAC地址生成原理及Java实现详解

    Android与iOS设备MAC地址生成原理及Java实现详解

    在无线网络通信中,MAC(Media Access Control)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备MAC地址生成原理以及Java实现方法,需要的可以了解下
    2025-05-05
  • 基于Springboot实现JWT认证的示例代码

    基于Springboot实现JWT认证的示例代码

    本文主要介绍了基于Springboot实现JWT认证,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • Java实现Elasticsearch查询当前索引全部数据的完整代码

    Java实现Elasticsearch查询当前索引全部数据的完整代码

    这篇文章主要介绍了如何在Java中实现查询Elasticsearch索引中指定条件下的全部数据,通过设置滚动查询参数(scroll),可以一次性获取满足条件的数据,而不需要限制每页的查询条数大小,这样可以避免因数据量过大而引发的性能问题,需要的朋友可以参考下
    2025-02-02
  • Spring Boot集成SpringFox 3.0与Pageable参数处理方法

    Spring Boot集成SpringFox 3.0与Pageable参数处理方法

    这篇文章主要介绍了Spring Boot集成SpringFox 3.0与Pageable参数处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10

最新评论