• 设计模式--2.工厂方法模式


    * 1. 工场方法模式:
    * 定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法,使一个类的实例化,延迟到其子类


    * 2. 工场方法通用类图
    * (1) 抽象产品类 Product,负责定义产品的共性
    * (2) Creator为抽象创建工厂类
    * (3) ConcreteCreator 为抽象创建工厂类的具体实现类,负责具体的创建产品类
    * (4) ConcreteProduct 即产品的具体实现类,由ConcreteCreator创建
    *
    * 3. 工场方法模式的优点
    * (1) 良好的封装性,代码结构清晰
    * (2) 优秀的扩展性。在增加产品类的情况下(如,要增加一个草莓类),只要适当修改工厂类,或扩展一个工厂类,只需增加一个草莓类,工厂类不需要
    * 做任何改变。
    * (3) 屏蔽产品类。产品类的实现类如何变化,调用者并不需要知道,它只关心产品的接口,只要接口不变化,系统中的上层模块就不会发生变化。
    * (4) 解耦。
    * a.符合迪米特法则,不需要的不去交流
    * b.符合依赖倒置法则,只依赖产品的抽象类
    * c.符合里氏替换法则,使用产品的子类,替换产品的父类
    *
    * 4.简单工厂模式:
    * 去掉抽象工厂

    场景类

    public class 场景类 {
        private void growFruit(){
            AbstractFruitFactory absFruitFactory = new FruitFactory();
            
            // 1.Apple
            Apple apple = absFruitFactory.growFruit(Apple.class);
            System.out.println(apple.getColor());
            apple.taste();
            
            // 2.Banana
            Banana banana = absFruitFactory.growFruit(Banana.class);
            System.out.println(banana.getColor());
            banana.taste();
            
            // 3.grape
            Grapes grape = absFruitFactory.growFruit(Grapes.class);
            System.out.println(grape.getColor());
            grape.taste();
        }
        
        public static void main(String[] args) {
            场景类 c = new 场景类();
            c.growFruit();
        }
    }

    AbstractFruitFactory

    public abstract class AbstractFruitFactory {
        
        // 抽象工厂,收割水果
        public abstract <T extends Fruit> T growFruit(Class<T>  c); 
    }

    FruitFactory

    public class FruitFactory extends AbstractFruitFactory {
    
        @SuppressWarnings("unchecked")
        @Override
        public <T extends Fruit> T growFruit(Class<T> c) {
            Fruit fruit = null;
            try{
                fruit = (T) Class.forName(c.getName()).newInstance();
            }catch(Exception e){
                System.out.println("收割水果出现错误");
            }
            return (T) fruit;
        }
    
    }

    Fruit类

    public interface Fruit {
        String getColor();
        
        void taste();
    }

    具体产品类

    Banana

    public class Banana implements Fruit{
    
        @Override
        public String getColor() {
            return "香蕉是黄色的";
        }
    
        @Override
        public void taste() {
             System.out.println("香蕉尝起来有点面");
        }
    
    }

    Apple

    public class Apple implements Fruit {
    
        @Override
        public String getColor() {
            return "苹果是红的";
        }
    
        @Override
        public void taste() {
             System.out.println("苹果尝起来很甜");
        }
    
    }

    Grapes

    public class Grapes implements Fruit {
    
        @Override
        public String getColor() {
            return "葡萄是紫的";
        }
    
        @Override
        public void taste() {
             System.out.println("葡萄尝起来有点酸");
        }
    
    }
  • 相关阅读:
    vue 自定义全局按键修饰符
    Vue 过滤器
    v-if、v-show 指令
    其他内置函数
    python中序列化和反序列化
    jmeter图形化html报告核心指标介绍
    jmeter在linux系统下如何进行压力测试
    文件操作的其他方法
    文件处理操作
    内置函数reduce()
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5656214.html
Copyright © 2020-2023  润新知