• 工厂模式的理解和使用


    一、是什么

    1. 定义

      工厂方法模式: 由子类决定要创建的具体类是哪一个

      抽象工厂: 允许客户创建对象的家族,而无需指定他们的具体类

    2. 理解

      从定义中可以看出, 抽象工厂包含了工厂方法,区别是抽象工厂创建的是家族

    3. 好处:

      封装具体对象的创建,促进松耦合

    4. 设计原则

      依赖倒置原则--依赖抽象,不依赖具体类

    二、示例

    工厂方法

    1. 工厂相关类

    /**
     * 工厂
     */
    public abstract class Factory {
    
        public abstract Milk makeMilk();
    }
    
    /**
     * A 工厂
     */
    public class FactoryA extends Factory {
        @Override
        public Milk makeMilk() {
            return new MilkA();
        }
    }
    
    /**
     * B 工厂
     */
    public class FactoryB extends Factory {
    
        @Override
        public Milk makeMilk() {
            return new MilkB();
        }
    }

    2. 牛奶类

    /**
     * 产品抽象类
     */
    public abstract class Milk {
    
        public abstract void print();
    }
    
    /**
     * 产品A
     */
    public class MilkA extends Milk {
    
        @Override
        public void print() {
            System.out.println("我是牛奶A");
        }
    }
    
    /**
     * 产品B
     */
    public class MilkB extends Milk {
    
        @Override
        public void print() {
            System.out.println("我是牛奶B");
        }
    
    }

    3. 测试

    /**
     * 测试类
     */
    public class Main {
    
        public static void main(String[] args) {
            Factory factoryA = new FactoryA();
            Factory factoryB = new FactoryB();
    
            Milk milkA = factoryA.makeMilk();
            Milk milkB = factoryB.makeMilk();
    
            milkA.print();
            milkB.print();
        }
    }

    抽象工厂

    1. 代码背景,分为南京和杭州两家工厂,他们各自生产自己的产品

    2. 芝士

    /**
     * 芝士
     */
    public abstract class Cheese {
        public String address = "";
    
        public Cheese(String address) {
            this.address = address;
        }
    
        public abstract void print();
    }
    
    /**
     * 南京生产的芝士
     */
    public class NanJingCheese extends Cheese {
    
        public NanJingCheese(String address) {
            super(address);
        }
    
        @Override
        public void print() {
            System.out.println(address + "的芝士");
        }
    }
    
    /**
     * 杭州芝士
     */
    public class HangZhouCheese extends Cheese {
    
        public HangZhouCheese(String address) {
            super(address);
        }
    
        @Override
        public void print() {
            System.out.println(address + "的芝士");
        }
    }

    3. 牛奶

    /**
     * 产品抽象类
     */
    public abstract class Milk {
        public String address = "";
    
        public Milk(String address) {
            this.address = address;
        }
    
        public abstract void print();
    }
    
    /**
     * 南京的牛奶
     */
    public class NanJingMilk extends Milk {
    
        public NanJingMilk(String address) {
            super(address);
        }
    
        @Override
        public void print() {
            System.out.println(address + "的牛奶");
        }
    }
    
    /**
     * 杭州牛奶
     */
    public class HangZhouMilk extends Milk {
    
        public HangZhouMilk(String address) {
            super(address);
        }
    
        @Override
        public void print() {
            System.out.println(this.address + "的牛奶");
        }
    }

    3. 工厂: 生产一组产品

    /**
     * 抽象工厂类
     */
    public abstract class Factory {
    
        public abstract Milk makeMilk();
    
        public abstract Cheese makeCheese();
    }
    
    /**
     * 南京工厂
     */
    public class NanJingFactory extends Factory {
        @Override
        public Milk makeMilk() {
            return new NanJingMilk("南京江宁");
        }
    
        @Override
        public Cheese makeCheese() {
            return new NanJingCheese("南京江宁");
        }
    }
    
    /**
     * 杭州工厂
     */
    public class HangZhouFactory extends Factory {
    
    
        @Override
        public Milk makeMilk() {
            return new HangZhouMilk("杭州萧山");
        }
    
        @Override
        public Cheese makeCheese() {
            return new HangZhouCheese("杭州萧山");
        }
    }

    4. 测试

    /**
     * 测试类
     */
    public class Main {
    
        public static void main(String[] args) {
            Factory hangZhouFactory = new HangZhouFactory();
            Cheese hangZhouCheese = hangZhouFactory.makeCheese();
            Milk hangZhouMilk = hangZhouFactory.makeMilk();
            hangZhouCheese.print();
            hangZhouMilk.print();
    
            Factory nanJingFactory = new NanJingFactory();
            Cheese nanJingCheese = nanJingFactory.makeCheese();
            Milk nanJingMilk = nanJingFactory.makeMilk();
            nanJingCheese.print();
            nanJingMilk.print();
        }
    }

    三、总结

    1. 所有工厂的目的都是封装对象的创建

    2.工厂方法使用的是继承,把对象的创建委托给子类,子类来实现工厂方法来创建对象

    3. 使用工厂模式的好处: 减少应用程序和具体类之间的依赖促进松耦合

  • 相关阅读:
    斐波那契额数列
    Handler+Looper+MessageQueue深入详解
    Android中常见的设计模式
    Java的序列化与反序列化
    Fragment的生命周期(与Activity的对比)
    两步搞定Activity的向右滑动返回的功能
    BOM和DOM的联系和区别
    JavaScript 之 使用 XMLHttpRequest 预览文件(图片)
    JavaScript 之 使用 XMLHttpRequest 上传文件
    JavaScript 客户端JavaScript之脚本化HTTP(通过XMLHttpRequest)
  • 原文地址:https://www.cnblogs.com/milicool/p/11278608.html
Copyright © 2020-2023  润新知