• 设计模式--工厂模式


    简单工厂模式学习

    package com.factory;
    
    //产品接口
    public interface Product {
        void craftwork(); //制作工艺
        void type(); //产品特征
    }
    package com.factory;
    
    //鲜奶实现类
    public class Creamery implements Product {
    
        @Override
        public void craftwork() {
            System.out.println("实现类制作工艺:牛奶+除菌=鲜奶");
        }
    
        @Override
        public void type() {
            System.out.println("实现类产品特征:原味浓香");
        }
    
    }
    package com.factory;
    
    //酸奶实现类
    public class Yoghourt implements Product {
    
        @Override
        public void craftwork() {
            System.out.println("实现类制作工艺:牛奶+酵母菌+糖=酸奶");
        }
    
        @Override
        public void type() {
            System.out.println("实现类产品特征:酸甜可口");
        }
    
    }
    package com.factory;
    //自定义异常
    public class BadException extends Exception {
    
        public BadException(String msg){
            super(msg);
        }
    }
    package com.factory;
    //静态工厂方法
    public class StaticFactory {
        public static Product factory(String str) throws BadException{
            if(str.equalsIgnoreCase("yoghourt")){
                System.out.println("静态工厂:生产酸奶");
                return new Yoghourt();
            }else
            if(str.equalsIgnoreCase("creamery")){
                System.out.println("静态工厂:生产鲜奶");
                return new Creamery();
            }else{
                throw new BadException("没有该类型产品!");
            }
        }
    }

    测试代码:

    package com.factory;
    //测试类
    public class Test {
    
        public static void main(String[] args) {
            try {
                Product y = StaticFactory.factory("Yoghourt");
                y.craftwork();
                y.type();
                Product c = StaticFactory.factory("Creamery");
                c.craftwork();
                c.type();
            } catch (BadException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    执行结果:

    静态工厂:生产酸奶
    实现类制作工艺:牛奶+酵母菌+糖=酸奶
    实现类产品特征:酸甜可口
    静态工厂:生产鲜奶
    实现类制作工艺:牛奶+除菌=鲜奶
    实现类产品特征:原味浓香

    总结:

    1、静态工厂决定哪一个产品类应当被实例化

    产品接口: 产品类1,产品类2,产品类3实现产品接口

    工厂类:如果有新的产品类添加,添加判断逻辑,依据逻辑进行产品类的实例化

    2、对开闭原则支持不够

    要修改工厂类

    工厂方法模式:

    1、克服了简单工厂模式的缺点

    2、工厂类不再负责所有的产品的创建,仅负责给出具体工厂子类必须实现的接口

    3、不接触哪个产品应该被实例化,只给出具体工厂子类必须实现的接口

    4、新增加产品的时候,不需要修改产品类和工厂接口类,只需要添加一个新的产品类,增加一个生产该产品的工厂即可

    5、遵循开闭原则,对扩展开放,对修改关闭

    package com.factorymethod;
    //产品工厂接口
    public interface ProductFactory {
        Product factory();
    }
    package com.factorymethod;
    
    public class CreameryFactory implements ProductFactory {
    
        @Override
        public Product factory() {
            System.out.println("鲜奶工厂类:生产鲜奶");
            return new Creamery();
        }
    }
    package com.factorymethod;
    
    public class YoghourtFactory implements ProductFactory {
    
        @Override
        public Product factory() {
            System.out.println("酸奶工厂类:生产酸奶");
            return new Yoghourt();
        }
    
    }

    测试类:

    package com.factorymethod;
    //测试类
    public class Test {
    
        public static void main(String[] args) {
            Product y = new YoghourtFactory().factory();
            y.craftwork();
            y.type();
            Product c = new CreameryFactory().factory();
            c.craftwork();
            c.type();
        }
    }

    执行结果:

    酸奶工厂类:生产酸奶
    实现类制作工艺:牛奶+酵母菌+糖=酸奶
    实现类产品特征:酸甜可口
    鲜奶工厂类:生产鲜奶
    实现类制作工艺:牛奶+除菌=鲜奶
    实现类产品特征:原味浓香

  • 相关阅读:
    转物理老师的说说,过好自己的生活,别人的梦幻生活背后也有你看不见的无奈
    第一、二、三、BC范式的学习总结
    一位毕业四年的前辈的经历
    普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法
    从零开始构建JavaScript框架4——DOM遍历2
    从零开始构建JavaScript框架3——DOM遍历1
    从零开始构建JavaScript框架2——总体结构以及元素的获取和创建
    从零开始构建JavaScript框架1——为何JavaScript开发需要框架
    从浏览器输入URL到页面加载完成到底发生了什么?
    第5课 C语言指针深入1
  • 原文地址:https://www.cnblogs.com/nikey/p/6437815.html
Copyright © 2020-2023  润新知