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


    使用频率:★★★★★

    一、什么是工厂方法

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

    二、补充说明

    符合开放--封闭"原则(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();
        }
    
    }
  • 相关阅读:
    go2基本类型
    go1
    android studio 使用
    ios34---GDC,dispatch_once
    ios33--线程通信
    ios33--线程安全
    ios32---线程的状态
    ios31--NSThread
    ios30---pthread, NSThread, GCD, NSOperation
    ios29--多线程
  • 原文地址:https://www.cnblogs.com/chenpi/p/5141376.html
Copyright © 2020-2023  润新知