zoukankan      html  css  js  c++  java
  • 《图解设计模式》读书笔记2-2 Factory Method模式

    类图

    代码

    //产品类,任意可“use”的产品都可继承该类
    public abstract class Product {
        public abstract void use();
    }
    
    //工厂类
    //定义了创建一个产品的流程,具体的创建代码需要子类实现
    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);
    }
    
    //一个具体的产品类
    public class IDCard extends Product {
        private String owner;
        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;
        }
    }
    
    //生产IDCard的工厂类
    public class IDCardFactory extends Factory {
        private List owners = new ArrayList();
    
        @Override
        protected Product createProduct(String owner) {
            return new IDCard(owner);
        }
    
        @Override
        protected void registerProduct(Product product) {
            owners.add(((IDCard)product).getOwner());
        }
    
        public List getOwners() {
            return owners;
        }
    }
    
    

    角色介绍

    • Product:是一个抽象类,定义了在工厂方法模式中生成的类所具有的接口(API)

    • Creator:负责生成Product角色的抽象类。不用new关键字生成实例,而是调用生成实例的方法来创建实例,防止基类和其他具体的类耦合。它只知道调用方法可以生成实例,对具体生成实例的ConcreteCreator一无所知,对具体方法的实现也一无所知。

    • ConcreteProduct:具体的产品类。

    • ConcreteCreator:具体的创建产品类的工厂。

    思想

    • 通过继承Product和Creator,我们可以创建各种各样的具体的工厂和产品,Product和Creator无需关心具体实现,他们不依赖于具体的工厂和产品的实现。

    • 可以将Product和Creator封装成一个框架,需要的时候直接引入,继承即可。

  • 相关阅读:
    ASC1 C New Year Bonus Grant
    CodeForces 180C Letter
    Codeforces 71C Round Table Knights
    GCPC2014 J Not a subsequence
    treeview自动从表中添加标题和列值做目录的方法2
    delphi学习treeview中从表列名和数据添加为目录并双击自动选中
    对一个表中所有列数据模糊查询adoquery
    单击dbgrid列标题排序 升降序
    从右键菜单里粘贴复制的工资到数据库里
    如何从右键弹出菜单中清空删除数据加清空前提问确定
  • 原文地址:https://www.cnblogs.com/qianbixin/p/10992880.html
Copyright © 2011-2022 走看看