• 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();
    
        }
    }
    
  • 相关阅读:
    MVC中使用AuthorizeAttribute做身份验证操作
    MVC Dynamic Authorization--示例市在Action前进行的验证,应提前到Auth过滤器
    forms
    UEditor
    Test log4net
    log4net.config
    [转]log4net使用(WinForm/WebFrom)
    如何指定模型的显示格式和模板
    64位系统中连接Access数据库文件的一个问题
    VS2008简体中文正式版序列号
  • 原文地址:https://www.cnblogs.com/myfaith-feng/p/12869174.html
Copyright © 2020-2023  润新知