zoukankan      html  css  js  c++  java
  • 图解设计模式-factory Method模式

    用Template Method模式构建生成实例的工厂。
    在factory method模式中,父类决定实例的生成方式,但是不决定所要生成的具体类,具体的处理交给子类负责。
     
    角色:
    Product产品:它定义了在Factory Method模式中的生成的那些实例所持有的接口,由Product类扮演。
    Creator创建者:负责生成Product角色的抽象类,由Factory类扮演。
    ConcreteProduct具体产品:决定具体的产品,由IDCard类扮演。
    ConcreteCreator具体创建者:负责生成具体的产品,有IDCardFactory类扮演此角色。
     
    优点:
    提供统一实例工厂的框架。
    框架与具体实现分开:可以根据不同产品类、创建不同的产品工厂,例如下面代码是IDCard产品与IDCardFactory产品工厂,也可以创建其他的产品和产品工厂。
    框架:Product产品抽象类、Factory工厂抽象类
    具体实现:IDCard产品类、IDCardFactory产品工厂类
     
    代码:
    public abstract class Factory {
    
        public final Product create(String owner) {
            Product product = createProduct(owner);
            register(product);
            return product;
        }
    
        public abstract Product createProduct(String owner);
        public abstract void register(Product product);
    }
    public abstract class Product {
    
        public abstract void use();
    }
    public class IDCard extends Product {
        private String owner;
    
        public IDCard(String owner) {
            System.out.println("创建"+owner+"的ID卡");
            this.owner=owner;
        }
        @Override
        public void use() {
            System.out.println("使用"+owner+"的ID卡");
        }
    
        public String getOwner(){
            return owner;
        }
    }
    public class IDCardFactory extends Factory {
        List owners = new ArrayList<>();
    
        @Override
        public Product createProduct(String owner) {
            return new IDCard(owner);
        }
    
        @Override
        public void register(Product product) {
            owners.add(((IDCard)product).getOwner());
        }
    }
    public class Main {
        public static void main(String[] args){
            Factory factory = new IDCardFactory();
            Product product1= factory.create("s1");
            Product product2= factory.create("s2");
            Product product3= factory.create("s3");
            product1.use();
            product2.use();
            product3.use();
        }
    }
    执行结果:
    创建s1的ID卡
    创建s2的ID卡
    创建s3的ID卡
    使用s1的ID卡
    使用s2的ID卡
    使用s3的ID卡
     
    代码说明:
    Factory抽象类中的create方法定义了创建实例的流程,即调用方法的顺序,先调用createProduct创建产品,在调用register方法把创建的产品进行保存(保存在哪里由具体的工厂决定)。
    Product抽象类中use方法定义了被工厂创建的实例中的使用方法,即use方法。(具体实例中方法不用,只起到测试作用,用于确认工厂确实可以创建实例并且调用到对应方法)
    IDCardFactory类继承了Factory抽象类,定了createProduct和register方法的具体实现,把创建的实例保存到List集合中。
    收藏文章数量从多到少与“把书读薄”是一个道理
  • 相关阅读:
    C++调用外部应用程序
    SVN文件加锁
    vs ComboBox显示多行
    __slots__ Python Class限制添加属性
    Python数据分析之pandas学习
    整理Lua和Unity和Lua交互文章链接
    [整理]Unity3D游戏开发之Lua
    ping telnet ssh netstat
    java rpc
    css 手机适配
  • 原文地址:https://www.cnblogs.com/use-D/p/9563120.html
Copyright © 2011-2022 走看看