zoukankan      html  css  js  c++  java
  • Factory Method模式(设计模式)

    父类决定实例的生成方式,但不决定要生成的具体的类,具体的处理全部交给子类负责。

    将生成实例的框架和实际负责生成实例的类解耦。

    从而实现不管我们需要什么样的产品和工厂,他们的实例生成方式已经由框架里面的抽象类决定了,他们只需要使用子类去实现满足不同场景需求的产品具体生成。
    Factory Method.png
    小案例

    Factory.java

    package framework;
    /**
     * @Author:DarknessShadow
     * @description:工厂,用来生成产品和注册产品
     * @date 2020/5/11 13:46
     */
    public abstract class Factory {
    
        public final Product create(String owner) {
            Product p = createProduct(owner);
            registerProduct(p);
            return p;
        }
    
        protected abstract Product createProduct(String owner);
    
        protected abstract void registerProduct(Product product);
    }
    

    Product.java

    package framework;
    /**
     * @Author:DarknessShadow
     * @description:产品父类
     * @date 2020/5/11 13:46
     */
    public abstract class Product {
        public abstract void use();
    }
    

    IDCardFactory.java

    package idcard;
    import framework.Factory;
    import framework.Product;
    import java.util.HashMap;
    import java.util.Map;
    /**
     * @Author:DarknessShadow
     * @description:继承工厂类,完成IDCard类实例产生的具体生成操作
     * @date 2020/5/11 13:47
     */
    public class IDCardFactory extends Factory {
    
        private Map<String,Integer> owners = new HashMap<>();
        private int index = 0;
    
        @Override
        protected Product createProduct(String owner) {
            return new IDCard(owner);
        }
    
        @Override
        protected void registerProduct(Product product) {
            owners.put(((IDCard) product).getOwner(), index);
            ((IDCard) product).setId(index);
            this.index  ++;
        }
    
        public Map<String, Integer> getOwners() {
            return owners;
        }
    }
    

    IDCard.java

    package idcard;
    import framework.Product;
    /**
     * @Author:DarknessShadow
     * @description:IDCard类是产品Product类的子类
     * @date 2020/5/11 13:47
     */
    public class IDCard extends Product {
    
        private String owner;
        private int id;
    
        IDCard(String owner) {
            System.out.println("制作" + owner + "的ID卡。");
            this.owner = owner;
        }
    
        @Override
        public void use() {
            System.out.println("使用" + owner + "的ID卡,所对应的编号为:" + id );
        }
    
        public String getOwner() {
            return owner;
        }
    
        public void setId(int id) {
            this.id = id;
        }
    
        public int getId() {
            return id;
        }
    }
    

    Main.java

    import framework.Factory;
    import framework.Product;
    import idcard.IDCardFactory;
    /**
     * @Author:DarknessShadow
     * @description:主测试程序
     * @date 2020/5/11 13:47
     */
    public class Main {
        public static void main(String[] args) {
            Factory factory = new IDCardFactory();
            Product card1 = factory.create("小明");
            Product card2 = factory.create("小红");
            Product card3 = factory.create("小话");
            card1.use();
            card2.use();
            card3.use();
    
        }
    }
    
  • 相关阅读:
    [LeetCode每日1题][简单] 169. 多数元素
    [LeetCode每日1题][简单] 1013. 将数组分成和相等的三个部分
    [LeetCode每日1题][中等] 322. 零钱兑换
    [LeetCode每日1题][中等] 面试题59
    软工实践个人总结
    2019 SDN大作业
    2019 SDN上机第7次作业
    第01组 Beta版本演示
    如果有一天我变得很有钱组——alpha冲刺day7
    如果有一天我变得很有钱组——alpha冲刺day6
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/12869174.html
Copyright © 2011-2022 走看看