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();
        }
    
    }
    复制代码
  • 相关阅读:
    iOS 6 Auto Layout NSLayoutConstraint 界面布局
    TexturePacker使用心得---1。
    今天说说敏捷个人-认识自我,管理自我 v0.2
    iPhone 5 屏幕尺寸变长指南
    JSON数据解析错误处理办法!
    IOS 入门介绍3iOS里面Frameworks介绍(续)
    Open GLSL ——01
    Open GLES 01
    IOS 入门介绍2iOS里面Frameworks介绍
    Opne GL ES 学习心得!
  • 原文地址:https://www.cnblogs.com/quinnsun/p/7382433.html
Copyright © 2011-2022 走看看