文章出處

使用頻率:★★★★★

一、什么是工廠方法

具體的工廠對象負責生產具體的產品對象;

二、補充說明

符合開放--封閉"原則(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();
    }

}

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()