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