• 设计模式之Factory工厂模式


    在上一章,模板模式中,我们在父类规定处理的流程,在子类中实现具体的处理。如果我们将该模式用于生成实例,便演变成了Factory模式,即工厂模式。

    在Factory模式中,父类决定实例的生成方式,但并不决定所要生成的具体的类,具体处理全部交给子类进行。

    设计实例则是模仿Spring框架进行的操作,模拟制作身份证。为了模拟Spring框架解耦,我们采用分包的方法,即生成实例的框架放在framework包中,而加工处理,具体实现的类放在具体实现的idcard包中。

    • framework包中的product类,用于表示产品这一类东西,定义了一个use抽象方法
    package site.wangxin520.gof.factory.framework;
    
    /**
     * 仿spring框架,定义的一个工厂类生产的产品类
     * @author wangXgnaw
     *
     */
    public abstract class Product {
        
        /**
         * 定义一个顶层抽象方法,用于框架中工厂生产的产品,具体实现交给子类
         */
        public abstract void use();
        
    }
    • framework包中的Factory类
    package site.wangxin520.gof.factory.framework;
    
    /**
     * 仿spring框架,建立一个Factory工厂,定义三个方法,具体实现交给子类完成。
     * 这里采用的是模板方法
     * @author wangXgnaw
     *
     */
    public abstract class Factory {
        
        /**
         * 使用模板方法,具体创建product的实现交给子类
         * @param owner 产品所有者姓名
         * @return Product
         */
        protected abstract Product createProduct(String owner);
        /**
         * 注册product
         * @param product
         */
        protected abstract void registerProduct(Product product);
        
        /**
         * 创建product对象的模板方法
         * @param owner 产品所有者姓名
         * @return Product
         */
        public final Product create(String owner){
            Product p=createProduct(owner);
            registerProduct(p);
            return p;
        }
    }
    • idcard包中的IDCard类
    package site.wangxin520.gof.factory.idcard;
    
    import site.wangxin520.gof.factory.framework.Product;
    
    /**
     * 身份证的实体类
     * @author wangXgnaw
     *
     */
    public class IDCard extends Product{
    
        /**
         * 隐藏IDCard的构造函数,拒绝外部包访问,外部包只能通过工厂模式进行访问
         */
        IDCard() {
        }
        
        //IDCard的属性
        private String owner;
        public String getOwner() {
            return owner;
        }
        public void setOwner(String owner) {
            this.owner = owner;
        }
    
    
        @Override
        public void use() {
            System.out.println(owner+"使用了身份证");
        }
    
    }
    • idcard包中的IDCardFactory类
    package site.wangxin520.gof.factory.idcard;
    
    import java.security.acl.Owner;
    import java.util.ArrayList;
    import java.util.List;
    
    import site.wangxin520.gof.factory.framework.Factory;
    import site.wangxin520.gof.factory.framework.Product;
    
    /**
     * 创建身份证的工厂
     * @author wangXgnaw
     *
     */
    public class IDCardFactory extends Factory {
        
        //记录登记创建了的产品信息,貌似如果是单例模式的话,就可以直接从这里取值了,最好是map结构(猜测)
        private List<Product> createdProduct=new ArrayList<Product>();
        
        @Override
        protected Product createProduct(String owner) {
            IDCard idCard=new IDCard();
            idCard.setOwner(owner);
            System.out.println("创建了"+owner+"的身份证");
            return idCard;
        }
    
        @Override
        protected void registerProduct(Product product) {
            createdProduct.add(product);
        }
    
    }
    • 具体测试类
    package site.wangxin520.gof.factory.idcard;
    
    import site.wangxin520.gof.factory.framework.Factory;
    import site.wangxin520.gof.factory.framework.Product;
    
    /**
     * 测试工厂类
     * @author wangXgnaw
     *
     */
    public class FactoryTest {
    
        public static void main(String[] args) {
            
            Factory factory=new IDCardFactory();
            
            Product p1 = factory.create("葵司");
            Product p2 = factory.create("上原亚衣");
            Product p3 = factory.create("古川伊织");
            
            p1.use();
            p2.use();
            p3.use();
            
        }
        
    }
    • 最终控制台输出结果为

    image

  • 相关阅读:
    JDBC链接mysql
    javac和java的使用
    PreparedStatement的execute误解
    sleep() 与 wait()的比较
    使用java程序模拟页面发送http的post请求
    《算法竞赛入门经典》6.1.2栈和队列-铁轨
    《算法竞赛入门经典》6.1栈和队列-卡片游戏
    《算法竞赛入门经典》5.42数学基础-因子和阶乘
    《算法竞赛入门经典》5.41数学基础-Cantor的数表
    qsort函数
  • 原文地址:https://www.cnblogs.com/wangxinblog/p/7604791.html
Copyright © 2020-2023  润新知