zoukankan      html  css  js  c++  java
  • 详谈 Java工厂 ---工厂方法模式

    1.前言

      有个场景,消费者需要付钱,有可能是使用支付宝、微信、银行卡,那么该怎么选择呢?

    是不是想到了使用用if else判断?还是使用switch?

      一个地方这样写还好,如果有很多这样的业务,难道都写一遍?我不想重复轮子,因此可以将他们都封装好,可以使用工厂模式将他们封装。

     什么是工厂模式?

      就是为了尽可能将代码的耦合度降低而产生的设计模式。

      这篇随笔讲解 工厂方法模式 的思路和具体操作。

    2.总结

    (1)工厂方法模式与静态工厂十分相似,甚至说思路基本一样,只是通过传入参数来选择不同的操作而已。
    (2)是在静态工厂的基础上改进的模式。
    (3)消费者只需要将关键词传给工厂,由工厂决定返回的内容。 (
    4)优点:将相似的业务集成在一起,使用基本一样的操作完成不同的业务。 (5)缺点:如果需要修改业务,需要修改工厂内容,耦合度太高了。

    3.操作

    (1)目录结构

      

     (2)建一个食物接口【规定了允许对食物的操作方法】

    package com.example.javabaisc.factory.staticfactory.origin;
    
    public interface Food {
        public void getFood();
    }
    View Code

    (3)两个食物接口的实现类【分别是苹果和面条】

    package com.example.javabaisc.factory.staticfactory.origin;
    
    public class Apple implements Food {
        @Override
        public void getFood() {
            System.out.println("apple");
        }
    }
    View Code
    package com.example.javabaisc.factory.staticfactory.origin;
    
    public class Noodles implements Food {
        @Override
        public void getFood() {
            System.out.println("Noodles");
        }
    }
    View Code

    (4)工厂类【决定生产什么食物】

    package com.example.javabaisc.factory.staticfactory.factory;
    
    import com.example.javabaisc.factory.staticfactory.origin.Apple;
    import com.example.javabaisc.factory.staticfactory.origin.Food;
    import com.example.javabaisc.factory.staticfactory.origin.Noodles;
    
    public class FoodFactory {
        public static String FF_Apple = "apple";
        public static String FF_Noodles = "noodles";
    
        public static Food getFood(String key) {
            if (key.equals(FF_Apple)) {
                return new Apple();
            } else if (key.equals(FF_Noodles)) {
                return new Noodles();
            } else {
                System.out.println("没有这种食物");
                return null;
            }
    
        }
    
    }
    View Code

    (5)测试类

    package com.example.javabaisc.factory.staticfactory;
    
    import com.example.javabaisc.factory.staticfactory.factory.FoodFactory;
    import com.example.javabaisc.factory.staticfactory.origin.Food;
    import org.junit.jupiter.api.Test;
    
    public class StFTest {
        @Test
        public void t(){
    
            //从工厂获取苹果
            Food food = FoodFactory.getFood(FoodFactory.FF_Apple);
            if (food != null){
                food.getFood();
            }
            //从工厂获取面条
            Food food2 = FoodFactory.getFood(FoodFactory.FF_Noodles);
            if (food2 != null){
                food2.getFood();
            }
    
        }
    
    }
    View Code

    (6)运行,打印结果

  • 相关阅读:
    EF中的EntityState几个状态的说明
    sql server 更新表,每天的数据分固定批次设置批次号sql
    bootstrap Validators
    马老师 生产环境mysql主从复制、架构优化方案
    PHP在微博优化中的“大显身手”
    将form表单转化为json数据
    免费资源库收集
    奇怪的php问题
    PHP 大数自动转换为科学计数法
    access database in a helper function ?
  • 原文地址:https://www.cnblogs.com/c2g5201314/p/13150194.html
Copyright © 2011-2022 走看看