zoukankan      html  css  js  c++  java
  • 【设计模式】工厂方法模式

    一、什么是工厂方法

    具体的工厂对象负责生产具体的产品对象;

    二、补充说明

    符合开放--封闭"原则(OCP),新增产品时,只需新增工厂的实现类、产品的实现类,不修改原来的代码;

    属于23种GOF设计模式中的一种;

    三、角色

    • 抽象工厂
    • 具体工厂
    • 抽象产品
    • 具体产品
    • 产品使用者

    具体工厂'继承'抽象工厂;

    具体产品'继承'抽象产品;

    每个具体工厂负责生产对应的具体产品;

    产品使用者使用每个具体工厂生产的具体产品;

    四、例子

    类关系图:

    代码实现:

    【抽象工厂】定义一个工厂接口,包含一个创建实例的方法,如下:

    package com.pichen.dp.creationalpattern.factorymethod;
    
    public interface IFatherFactory {
        public Father createFather(String name);
    }

    【具体工厂】定义两个具体工厂类,实现工厂接口,如下:

    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public class ChineseFatherFactory implements IFatherFactory{
    
        @Override
        public Father createFather(String name) {
            return new ChineseFather(name);
        }
    
    }
    复制代码
    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public class AmericanFatherFactory implements IFatherFactory{
    
        @Override
        public Father createFather(String name) {
            return new AmericanFather(name);
        }
    
    }
    复制代码

    【抽象产品】定义一个抽象产品类:

    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public abstract class Father {
        private String name;
    
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
        
        public abstract void printName();
    }
    复制代码

    【具体产品】定义两个具体产品类,继承抽象产品:

    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public class ChineseFather extends Father{
        public ChineseFather(String name) {
            this.setName(name);
        }
        @Override
        public void printName() {
            System.out.println(this.getClass().getName() + ":" + this.getName());
        }
    
    }
    复制代码
    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public class AmericanFather extends Father{
        public AmericanFather(String name) {
            this.setName(name);
        }
        @Override
        public void printName() {
            System.out.println(this.getClass().getName() + ":" + this.getName());
        }
    
    }
    复制代码

    【产品使用者】写个main函数,调用具体工厂类生产具体产品:

    复制代码
    package com.pichen.dp.creationalpattern.factorymethod;
    
    public class Main {
        public static void main(String[] args) {
            IFatherFactory cnff = new ChineseFatherFactory();
            Father cnFather = cnff.createFather("cn father");
            cnFather.printName();
            
            IFatherFactory usff = new AmericanFatherFactory();
            Father usFather = usff.createFather("us father");
            usFather.printName();
        }
    
    }
    复制代码
  • 相关阅读:
    疫情数据背后,聊聊数据分析平台变迁史
    华为五大专家亲述:如何转型搞 AI?
    【华为云技术分享】LwM2M协议的学习与分享
    Spring5参考指南: BeanWrapper和PropertyEditor
    Spring5参考指南: Resources
    Spring5参考指南:事件Event
    Spring5参考指南:Environment
    Spring5参考指南:JSR 330标准注解
    Spring5参考指南:组件扫描
    Spring5参考指南:基于注解的容器配置
  • 原文地址:https://www.cnblogs.com/quinnsun/p/7382433.html
Copyright © 2011-2022 走看看