java設計模式----工廠設計模式
阿新 • • 發佈:2018-11-14
目錄
1.面向物件設計的基本原則
2.簡單工廠模式
3.工廠方法模式
4.抽象工廠模式
工廠設計模式的核心本質:
1、例項化物件,用工廠方法代替new操作。
2、將選擇實現類、建立物件統一管理和控制。從而將呼叫者跟我們的實現類解耦。
一、面向物件設計的基本原則
1.OCP(開閉原則,Open-Closed Principle):一個軟體的實體應當對擴充套件開放,對修改關閉。
2.DIP(依賴倒轉原則,Dependence Inversion Principle):要針對介面程式設計不要針對實現程式設計。
3.LoD(迪米特法則,Law of Demeter):只與你直接的朋友通訊,而避免和陌生人通訊。
二、簡單工廠模式
如果不使用工廠設計模式來建立物件,那麼我們的程式將與多個類打交道。但是如果我們使用工廠設計模式的話,程式則不會與多個類有交集。
一下是不使用工廠設計模式類的關係圖與Demo:
package com.demo.simpleFactory; /** *動物介面 */ public interface Animal { void sleep(); }Alimal介面
1Cat類package com.demo.simpleFactory; 2 3 public class Cat implements Animal{ 4 5 @Override 6 public void sleep() { 7 System.out.println("貓在睡覺"); 8 } 9 10 }
1 package com.demo.simpleFactory; 2 3 public class Dog implements Animal{ 4Dog類5 @Override 6 public void sleep() { 7 System.out.println("狗在睡覺"); 8 } 9 10 }
1 package com.demo.simpleFactory; 2 3 public class Client { 4 public static void main(String[] args) { 5 Animal a = new Dog(); 6 Animal a1 = new Cat(); 7 a.sleep(); 8 a1.sleep(); 9 } 10 }Client使用者類
使用簡單工廠模式則是建立一個工廠,使用者使用的時候只需要在工廠類中拿物件。
1 package com.demo.simpleFactory; 2 3 /** 4 * 工廠類 5 * @author Administrator 6 * 7 */ 8 public class SimpleFactory { 9 public static Animal createAnimal(String animal){ 10 if("狗".equals(animal)){ 11 return new Dog(); 12 }else if("貓".equals(animal)){ 13 return new Cat(); 14 }else{ 15 return null; 16 } 17 } 18 }SimpleFactory簡單工廠類
另一種寫法:
1 package com.demo.simpleFactory; 2 3 /** 4 * 工廠類 5 * @author Administrator 6 * 7 */ 8 public class SimpleFactory { 9 public static Animal createDog(){ 10 return new Dog(); 11 } 12 public static Animal createCat(){ 13 return new Cat(); 14 } 15 }SimpleFactory簡單工廠類
使用者則可以通過如下方法建立物件:
package com.demo.simpleFactory; /** * 使用者通過呼叫工廠建立物件 * @author Administrator * */ public class Client { public static void main(String[] args) { Animal a1 = SimpleFactory.createAnimal("狗"); Animal a2 = SimpleFactory.createAnimal("貓"); a1.sleep(); a2.sleep(); } }
使用工廠模式建立物件的類依賴圖如下:
三、工廠方法模式
在以上的工廠模式中,設計原理是違反面向物件基本原則的OCP原則的,我們需要將重新設計這個工廠方法模式。
以下是重新設計的工廠模式圖解與Demo:
1 package com.demo.simpleFactory; 2 /** 3 * 工廠方法模式抽象類 4 * @author Administrator 5 * 6 */ 7 public interface AnimalFactory { 8 Animal createAnimal(); 9 }工廠抽象類
1 package com.demo.simpleFactory; 2 3 4 public class CatFactory implements AnimalFactory{ 5 6 @Override 7 public Animal createAnimal() { 8 return new Cat(); 9 } 10 11 }Cat工廠
1 package com.demo.simpleFactory; 2 3 public class Dog implements Animal{ 4 5 @Override 6 public void sleep() { 7 System.out.println("狗在睡覺"); 8 } 9 10 }Dog工廠
1 package com.demo.simpleFactory; 2 /** 3 * 使用者通過呼叫工廠建立物件 4 * @author Administrator 5 * 6 */ 7 public class Client { 8 public static void main(String[] args) { 9 Animal cat = new CatFactory().createAnimal(); 10 Animal dog = new DogFactory().createAnimal(); 11 cat.sleep(); 12 dog.sleep(); 13 } 14 }Client使用者
四、抽象工廠模式
抽象工廠模式是工廠方法模式的升級版本,在有多個業務品種、業務分類時,通過抽象工廠模式產生需要的物件是一種非常好的解決方式。
作用:用來生產不同產品族的全部產品,不能增加新的產品,但支援產品族。
抽象工廠模式的簡單實現:
軟體包結構如下:
package com.demo.abstractFactory.spare; /** * 引擎介面 * @author Administrator * */ public interface Engine { void run(); }Engine介面
package com.demo.abstractFactory.spare; /** * 座椅介面 * @author Administrator * */ public interface Seat { void feel(); }Seat介面
package com.demo.abstractFactory.spare; /** * 輪胎介面 * @author Administrator * */ public interface Tyre { void quality(); }Tyre介面
package com.demo.abstractFactory.factory; import com.demo.abstractFactory.spare.Engine; import com.demo.abstractFactory.spare.Seat; import com.demo.abstractFactory.spare.Tyre; /** * 汽車工廠 * @author Administrator * */ public interface CarFactory { Engine createEngine(); Seat createSeat(); Tyre createTyre(); }CarFactory介面
package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Engine; public class LowEngine implements Engine{ @Override public void run() { System.out.println("汽車跑得慢"); } } package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Seat; public class LowSeat implements Seat{ @Override public void feel() { System.out.println("座椅沒按摩功能"); } } package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Tyre; public class LowTyre implements Tyre{ @Override public void quality() { System.out.println("輪胎易磨損"); } } package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Engine; public class LuxuryEngine implements Engine{ @Override public void run() { System.out.println("汽車跑得快"); } } package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Seat; public class LuxurySeat implements Seat{ @Override public void feel() { System.out.println("座椅有按摩功能"); } } package com.demo.abstractFactory.product; import com.demo.abstractFactory.spare.Tyre; public class LuxuryTyre implements Tyre{ @Override public void quality() { System.out.println("輪胎耐磨損"); } }產品實現類
package com.demo.abstractFactory.factory; import com.demo.abstractFactory.product.LuxuryEngine; import com.demo.abstractFactory.product.LuxurySeat; import com.demo.abstractFactory.product.LuxuryTyre; import com.demo.abstractFactory.spare.Engine; import com.demo.abstractFactory.spare.Seat; import com.demo.abstractFactory.spare.Tyre; public class LuxuryCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LuxuryEngine(); } @Override public Seat createSeat() { return new LuxurySeat(); } @Override public Tyre createTyre() { return new LuxuryTyre(); } }高階工廠類
package com.demo.abstractFactory.factory; import com.demo.abstractFactory.product.LowEngine; import com.demo.abstractFactory.product.LowSeat; import com.demo.abstractFactory.product.LowTyre; import com.demo.abstractFactory.spare.Engine; import com.demo.abstractFactory.spare.Seat; import com.demo.abstractFactory.spare.Tyre; public class LowCarFactory implements CarFactory{ @Override public Engine createEngine() { return new LowEngine(); } @Override public Seat createSeat() { return new LowSeat(); } @Override public Tyre createTyre() { return new LowTyre(); } }低階工廠類
package com.demo.abstractFactory; import com.demo.abstractFactory.factory.CarFactory; import com.demo.abstractFactory.factory.LowCarFactory; import com.demo.abstractFactory.factory.LuxuryCarFactory; public class Client { public static void main(String[] args) { CarFactory lowCarFactory = new LowCarFactory(); CarFactory luxuryCarFactory = new LuxuryCarFactory(); lowCarFactory.createEngine().run(); lowCarFactory.createSeat().feel(); luxuryCarFactory.createTyre().quality(); } }客戶端實現類