IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java工厂模式实战、学习 -> 正文阅读

[Java知识库]java工厂模式实战、学习

概念

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
?

?

意图

  • 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,
  • 工厂模式使其创建过程延迟到子类进行。

?

工厂一般分类有以下:

  • 简单工厂
  • 工厂方法
  • 抽象工厂

工厂模式实践

简单工厂

实现一个国家工厂,不同的国家人讲不同的hello
?

?

1、先创建一个接口,用来表示国家

package factory;

public interface Country {
    void hello();
}

2、实现三个不同的国家类

package factory;

public class American implements Country {
    @Override
    public void hello() {
        System.out.println("hello American");
    }
}


package factory;

public class Chinese implements Country {
    @Override
    public void hello() {
        System.out.println("你好");
    }
}


package factory;

public class English implements Country {

    @Override
    public void hello() {
        System.out.println("hello english");
    }
}

3、创建一个工厂类和创建实例方法

package factory;

import javax.print.DocFlavor;
/**
        * 方式一:使用switch case作为区分
        这种方式虽然也可以,但是在实际过程中,一般不以手写单词作为方式
        */
public class CountryFactory {
    public Country getCountry(String type){
        type = type.toLowerCase();

        
        switch (type){
            case "chinese":
                return new Chinese();
            case "american":
                return new American();
            case "english":
                return new English();
            default:
                return null;
        }
    }
}




package factory;

import java.util.HashMap;

/**
* 方式二: 使用hashmap作为存储,好处就是方便管理,但是坏处的话,就是占用内存
*/
public class CountryFactory2 {
    private static HashMap<String,Country> map=new HashMap<>();
    static{
        map.put("chinese",new Chinese());
        map.put("american",new Chinese());
        map.put("english",new Chinese());
        
    }
    
    
    public Country getCountry(String type){
        type = type.toLowerCase();
        return map.getOrDefault(type,null);
    }
}

4、测试结果

package factory;

public class Test {
    public static void main(String[] args) {
        CountryFactory countryFactory = new CountryFactory();
        countryFactory.getCountry("Chinese").hello();
        countryFactory.getCountry("American").hello();
        countryFactory.getCountry("English").hello();
    }


    /**
    * 返回结果:
     * 你好
     * hello American
     * hello english
    */

}

?

优点

1.解耦 添加新的对象,只需要找工厂类中添加即可,即也不需要关注业务逻辑
2.帮助封装,使面向接口编程;

缺点

1.不方便子工厂的扩展

工厂方法

  • 由于简单工厂不方便扩展的问题

image.png

案例:创建一个人种的工厂方法
1、创建一个人种父类

package factory.factoryMethod;

import lombok.Data;

@Data
public class Human {
    String type;
    String skin;

    public Human(String type, String skin) {
        this.type = type;
        this.skin = skin;
    }

    public void desc(){
        System.out.println("我是"+type+"   肤色是:"+skin);
    }
}

2、创建三个人种,都继承human类

package factory.factoryMethod;

public class BlackRace extends Human{
    public BlackRace(String type, String skin) {
        super(type, skin);
    }
}


package factory.factoryMethod;

public class WhiteRace extends Human{
    public WhiteRace(String type, String skin) {
        super(type, skin);
    }
}


package factory.factoryMethod;

public class YellowRace extends Human{
    public YellowRace(String type, String skin) {
        super(type, skin);
    }
}

3、创建工厂抽象类

package factory.factoryMethod;

public abstract class HumanAbstractFactory {

    public Human createHuman(){
        return null;
    }
}

4、创建三个具体人种的工厂类,都继承工厂抽象类。这里是扩展的关键

package factory.factoryMethod;

public class WhiteFactory extends HumanAbstractFactory{

    @Override
    public Human createHuman() {
        return new WhiteRace("白种人","白色");
    }
}



package factory.factoryMethod;

public class YellowFactory extends HumanAbstractFactory{

    @Override
    public Human createHuman() {
        return new YellowRace("黄种人","黄色");
    }
}


package factory.factoryMethod;

public class BlackFactory extends HumanAbstractFactory{

    @Override
    public Human createHuman() {
        return new BlackRace("黑种人","黑色");
    }
}

5、测试

package factory.factoryMethod;

public class Test {
    public static void main(String[] args) {
        new BlackFactory().createHuman().desc();
        new WhiteFactory().createHuman().desc();
        new YellowFactory().createHuman().desc();
    }

    /**
     * 输出结果:
    * 我是黑种人   肤色是:黑色
     * 我是白种人   肤色是:白色
     * 我是黄种人   肤色是:黄色
    */
}

工厂方法优势

1.满足JAVA的开闭原则,即如果需要新增加产品,只需要简单继承即可
2.每一种工厂只负责生产一种产品,保证单独处理业务逻辑,减少了简单工厂中switch判断

缺点

1.只能创建单一的产品
2.每新增加产品,都需要继承父类 增加系统复杂性

参考案例:https://www.cnblogs.com/zhucj-java/p/13598013.html

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:14:58  更:2022-03-08 22:19:22 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:22:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码