zoukankan      html  css  js  c++  java
  • 设计模式--工厂模式

    简单工厂模式学习

    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();
        }
    }

    执行结果:

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

  • 相关阅读:
    Swift中枚举的总结以及使用
    CapsLock Enhancement via AutoHotKey
    计算思维
    计算几何-凸包算法 Python实现与Matlab动画演示
    CapsLock魔改大法——变废为宝实现高效编辑
    Python调用Matlab2014b引擎
    VC++如何利用Matlab2014b的图形引擎进行绘图
    Window中C++进行精确计时的方法
    十四。算法小知识点
    十三。宫水三叶公众号总结
  • 原文地址:https://www.cnblogs.com/nikey/p/6437815.html
Copyright © 2011-2022 走看看