• 【设计模式】工厂方法模式


    一、什么是工厂方法

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

    二、补充说明

    符合开放--封闭"原则(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();
        }
    
    }
    复制代码
  • 相关阅读:
    CSS中一个冒号和两个冒号有什么区别
    伪类元素实现可伸缩时间轴
    Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
    for 循环进化史
    细谈sass和less中的变量及其作用域
    Vue2.0源码阅读笔记--双向绑定实现原理
    你所不知道的setTimeout
    前端COOKIE与SESSION的区别
    js移动端向左滑动出现删除按钮
    推荐几款屏幕录制工具(可录制GIF)
  • 原文地址:https://www.cnblogs.com/quinnsun/p/7382433.html
Copyright © 2020-2023  润新知