工廠模式之抽象工廠方法

package com.qf58.exec.abstractfactory;

/**
 * 工廠的產品
 *
 * 怎麼把一個功能提升一個層次:定義抽象(抽象類,接口)
 * 抽象類,接口  就會有多實現,多實現自然就有多功能
 */
public abstract class AbstractCar {

    String engine;
    public abstract void run();
}

 

package com.qf58.exec.abstractfactory;

/**
 * 抽象產品
 */
public abstract class AbstractMask {

    Integer price;
    public abstract void protectedMe();
}

 

上面是抽象工廠定義

下面是具體實現

package com.qf58.exec.abstractfactory;



public class RacingCar extends AbstractCar {

    public RacingCar(){
        this.engine = "v8發動機";
    }
    @Override
    public void run() {
        System.out.println(engine+"=--.....");
    }
}

 

package com.qf58.exec.abstractfactory;


/**
 * 具體產品
 */
public class VanCar extends AbstractCar {
    public VanCar(){
        this.engine = "單槓柴油機";
    }

    @Override
    public void run() {
        System.out.println(engine+"--》嗒嗒嗒....");
    }
}
package com.qf58.exec.abstractfactory;

public class CommonMask  extends AbstractMask{
    public CommonMask(){
        price = 1;
    }
    @Override
    public void protectedMe() {
        System.out.println("普通口罩....簡單保護...請及時更換");
    }
}
package com.qf58.exec.abstractfactory;

/**
 * 具體產品
 */
public class N95Mask  extends AbstractMask{
    public N95Mask(){
        this.price = 2;
    }

    @Override
    public void protectedMe() {
        System.out.println("N95口罩....超級防護");
    }
}

 

下面是總體規範,可以認爲是總公司,有生產口罩和汽車的能力

package com.qf58.exec.abstractfactory;

import java.util.List;

/**
 * 總廠規範:
 * Wulin集團
 *
 * 可以使用接口;
 */
public abstract class WulinFactory {

    List<String> rules;
    //能生產車,又能生產口罩
    abstract AbstractCar newCar();
    abstract AbstractMask newMask();
}

 

下面是分廠,智能生產汽車

package com.qf58.exec.abstractfactory;


/**
 * 具體工廠。只造車
 */
public class WulinRacingCarFactory extends WulinCarFactory {
    @Override
    AbstractCar newCar() {
        return new RacingCar();
    }
}
package com.qf58.exec.abstractfactory;

/**
 * 分廠:VanCar
 */
public class WulinVanCarFactory extends WulinCarFactory{
    @Override
    AbstractCar newCar() {
        return new VanCar();
    }

}

 

下面是分廠,只負責生產口罩:

 

package com.qf58.exec.abstractfactory;

/**
 * 工廠的產品
 *
 * 怎麼把一個功能提升一個層次:定義抽象(抽象類,接口)
 * 抽象類,接口  就會有多實現,多實現自然就有多功能
 */
public abstract class AbstractCar {

    String engine;
    public abstract void run();
}

 

package com.qf58.exec.abstractfactory;

/**
 * 抽象產品
 */
public abstract class AbstractMask {

    Integer price;
    public abstract void protectedMe();
}

 

上面是抽象工廠定義

下面是具體實現

package com.qf58.exec.abstractfactory;



public class RacingCar extends AbstractCar {

    public RacingCar(){
        this.engine = "v8發動機";
    }
    @Override
    public void run() {
        System.out.println(engine+"=--.....");
    }
}

 

package com.qf58.exec.abstractfactory;


/**
 * 具體產品
 */
public class VanCar extends AbstractCar {
    public VanCar(){
        this.engine = "單槓柴油機";
    }

    @Override
    public void run() {
        System.out.println(engine+"--》嗒嗒嗒....");
    }
}
package com.qf58.exec.abstractfactory;

public class CommonMask  extends AbstractMask{
    public CommonMask(){
        price = 1;
    }
    @Override
    public void protectedMe() {
        System.out.println("普通口罩....簡單保護...請及時更換");
    }
}
package com.qf58.exec.abstractfactory;

/**
 * 具體產品
 */
public class N95Mask  extends AbstractMask{
    public N95Mask(){
        this.price = 2;
    }

    @Override
    public void protectedMe() {
        System.out.println("N95口罩....超級防護");
    }
}

 

下面是總體規範,可以認爲是總公司,有生產口罩和汽車的能力

package com.qf58.exec.abstractfactory;

import java.util.List;

/**
 * 總廠規範:
 * Wulin集團
 *
 * 可以使用接口;
 */
public abstract class WulinFactory {

    List<String> rules;
    //能生產車,又能生產口罩
    abstract AbstractCar newCar();
    abstract AbstractMask newMask();
}

 

下面是分廠,智能生產汽車

package com.qf58.exec.abstractfactory;


/**
 * 具體工廠。只造車
 */
public class WulinRacingCarFactory extends WulinCarFactory {
    @Override
    AbstractCar newCar() {
        return new RacingCar();
    }
}
package com.qf58.exec.abstractfactory;

/**
 * 分廠:VanCar
 */
public class WulinVanCarFactory extends WulinCarFactory{
    @Override
    AbstractCar newCar() {
        return new VanCar();
    }

}

 

下面是分廠,只負責生產口罩:

package com.qf58.exec.abstractfactory;

/**
 * wulin口罩集團
 */
public abstract class WulinMaskFactory extends WulinFactory{
    @Override
    AbstractCar newCar() {
        return null;
    }


    abstract AbstractMask newMask();
}

 

下面是具體的工廠實現

package com.qf58.exec.abstractfactory;


/**
 * 只造口罩
 */
public class WulinHangZhouMaskFactory extends WulinMaskFactory {

    @Override
    AbstractMask newMask() {
        return new CommonMask();
    }
}
package com.qf58.exec.abstractfactory;

/**
 * 分廠:負責口罩
 */
public class WulinWuHanMaskFactory  extends WulinMaskFactory{

    @Override
    AbstractMask newMask() {
        return new N95Mask();
    }
}

 

下面是測試類

package com.qf58.exec.abstractfactory;


/**
 * 抽象出來。
 *      可以抽象成接口(只有方法),可以抽象成抽象類(有些屬性也需要用)
 */
public class MainTest {

    public static void main(String[] args) {

        //
        WulinFactory wulinFactory = new WulinWuHanMaskFactory();
        AbstractCar abstractCar = wulinFactory.newCar();

        AbstractMask abstractMask = wulinFactory.newMask();
        abstractMask.protectedMe();


        wulinFactory = new WulinHangZhouMaskFactory();
        AbstractMask abstractMask1 = wulinFactory.newMask();
        abstractMask1.protectedMe();
    }
}

 

效果:

體會:就抽象工廠方法而言,雖然寫的類比較多,但是擴展性是比簡單工廠強太多了,簡單工廠需要改原類代碼,而抽象工廠方法而言,只是擴展類而已,如果我要再新加分廠就直接繼承原有抽象類進行實現就可以了 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章