zoukankan      html  css  js  c++  java
  • 工厂模式的理解和使用

    一、是什么

    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. 使用工厂模式的好处: 减少应用程序和具体类之间的依赖促进松耦合

  • 相关阅读:
    linux安装mysql5.6全流程
    linux安装redis集群全流程
    脑图-流程图-ppt制作工艺
    控制台添加log4net
    正则表达式非获取匹配的用法
    Win10查看已存储WiFi密码的两种方法
    redis中list set zset的区别
    Topshelf 搭建 Windows 服务
    SQLSERVER 自增列跳ID 1W-1K问题
    sqlserver 自增列(id)跳跃问题,一下就跳过一千多个id
  • 原文地址:https://www.cnblogs.com/milicool/p/11278608.html
Copyright © 2011-2022 走看看