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();
    
        }
    }
    
  • 相关阅读:
    linux cpu load学习笔记
    P1064 金明的预算方案
    P1757 通天之分组背包
    P1352 没有上司的舞会
    P1651 塔
    P1250 种树
    P1938 [USACO09NOV]找工就业Job Hunt
    P4392 [BOI2007]Sound 静音问题
    P3884 [JLOI2009]二叉树问题
    P2880 [USACO07JAN]平衡的阵容Balanced Lineup
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/12869174.html
Copyright © 2011-2022 走看看