Java设计模式(一) -- 工厂方法模式
生活随笔
收集整理的這篇文章主要介紹了
Java设计模式(一) -- 工厂方法模式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java的設計模式大體上分為三大類:
?創建型模式(5種):工廠方法模式,抽象工廠模式,單例模式,建造者模式,原型模式。
?結構型模式(7種):適配器模式,裝飾器模式,代理模式,外觀模式,橋接模式,組合模式,享元模式。
?行為型模式(11種):策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。
此外,還有兩類:并發型模式和線程池模式。
工廠模式:工廠模式是Java常用的設計模式之一,該設計模式屬于創建型于創建型模式,它提供了一種創建對象的最佳方式。工廠模式主要是為創建對象提供過渡接口,無需給客戶端暴露創建邏輯,將創建對象的具體過程封裝隱蔽起來,達到設計上的靈活性。工廠模式可以分為三類:(1)簡單工廠模式(Simple Factory)(2)工廠方法模式(Factory Method)(3)抽象工廠模式(Abstract Factory)簡單工廠模式:簡單工廠模式又稱靜態工廠方法模式,將實現的業務的細節放到工廠類中,客戶端只需傳入工廠類的參數即可
組成部分: (1)工廠類:核心類,包含業務的邏輯,用于創建產品(2)抽象產品:一般是具體產品繼承的父類或者實現的接口(3)具體產品:工廠類創建的對象即為該類的實例
下面我們看一下具體的例子:
package FactoryMode.Simple_Factory;public class Circle implements Shape{@Overridepublic void draw() {System.out.println("I can draw a circle.");}
}
package FactoryMode.Simple_Factory;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("I can draw a rectangle.");}
}
package FactoryMode.Simple_Factory;public class Square implements Shape {@Overridepublic void draw() {System.out.println("I can draw a square.");} }
package FactoryMode.Simple_Factory;public interface Shape {public void draw(); }
package FactoryMode.Simple_Factory;public class ShapeFactory {public Shape getShape(String shapeType){if ("circle".equals(shapeType)){return new Circle();}else if ("rectangle".equals(shapeType)){return new Rectangle();}else if ("square".equals(shapeType)){return new Square();}else {return null;}} }
package FactoryMode.Simple_Factory;public class ShapeTest {public static void main(String[] args){ShapeFactory sf = new ShapeFactory();sf.getShape("circle").draw();sf.getShape("rectangle").draw();sf.getShape("square").draw();} }
結果是: I can draw a circle. I can draw a rectangle. I can draw a square. 很顯然,當我們需要增加新的圖形時,工廠類限制了我們的擴展,增加了類之間的耦合度,需要我們手動修改工廠類。因此簡單工廠模式只適合在創建對象較少、 簡單情況下使用。 工廠方法模式:定義一個創建對象的工廠接口,讓子類決定實例化哪一個類,并將實際創建工作推遲到子類當中。 組成部分:(1)抽象工廠:該模式的核心部分,給客戶端調用的一個接口,是具體工廠必須實現的接口或者繼承的父類(2)具體工廠:具體業務邏輯的實現,可創建具體產品的實例對象(3)抽象產品:具體產品必須實現的接口或者繼承的父類(4)具體產品:具體工程創建的對象是此類的實例 具體實例: package FactoryMode.Factory_Method;public interface Shape {public void draw(); } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("I can draw a circle.");} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("I can draw a rectangle.");} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public interface ShapeFactory {public Shape getShape(); } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class CircleFactory implements ShapeFactory {@Overridepublic Shape getShape() {return new Circle();} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class RectangleFactory implements ShapeFactory {@Overridepublic Shape getShape() {return new Rectangle();} }
package FactoryMode.Factory_Method;public class FactoryTest {public static void main(String[] args){ShapeFactory cf = new CircleFactory();cf.getShape().draw();ShapeFactory rf = new RectangleFactory();rf.getShape().draw();} }
結果是: I can draw a circle. I can draw a rectangle. 工廠方法模式通過多個實現抽象工廠的具體工廠,為簡單工廠模式的工廠類分擔了壓力,當有新的Shape產生時,只需創建一個 具體工廠類和具體產品類,無需修改原有的代碼,復合六大原則的開閉原則。 以上就是簡單工廠模式和工廠方法模式,抽象工廠模式將放到下一小節。
package FactoryMode.Simple_Factory;public class Square implements Shape {@Overridepublic void draw() {System.out.println("I can draw a square.");} }
package FactoryMode.Simple_Factory;public interface Shape {public void draw(); }
package FactoryMode.Simple_Factory;public class ShapeFactory {public Shape getShape(String shapeType){if ("circle".equals(shapeType)){return new Circle();}else if ("rectangle".equals(shapeType)){return new Rectangle();}else if ("square".equals(shapeType)){return new Square();}else {return null;}} }
package FactoryMode.Simple_Factory;public class ShapeTest {public static void main(String[] args){ShapeFactory sf = new ShapeFactory();sf.getShape("circle").draw();sf.getShape("rectangle").draw();sf.getShape("square").draw();} }
結果是: I can draw a circle. I can draw a rectangle. I can draw a square. 很顯然,當我們需要增加新的圖形時,工廠類限制了我們的擴展,增加了類之間的耦合度,需要我們手動修改工廠類。因此簡單工廠模式只適合在創建對象較少、 簡單情況下使用。 工廠方法模式:定義一個創建對象的工廠接口,讓子類決定實例化哪一個類,并將實際創建工作推遲到子類當中。 組成部分:(1)抽象工廠:該模式的核心部分,給客戶端調用的一個接口,是具體工廠必須實現的接口或者繼承的父類(2)具體工廠:具體業務邏輯的實現,可創建具體產品的實例對象(3)抽象產品:具體產品必須實現的接口或者繼承的父類(4)具體產品:具體工程創建的對象是此類的實例 具體實例: package FactoryMode.Factory_Method;public interface Shape {public void draw(); } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class Circle implements Shape {@Overridepublic void draw() {System.out.println("I can draw a circle.");} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("I can draw a rectangle.");} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public interface ShapeFactory {public Shape getShape(); } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class CircleFactory implements ShapeFactory {@Overridepublic Shape getShape() {return new Circle();} } package FactoryMode.Factory_Method;import FactoryMode.Simple_Factory.Shape;public class RectangleFactory implements ShapeFactory {@Overridepublic Shape getShape() {return new Rectangle();} }
package FactoryMode.Factory_Method;public class FactoryTest {public static void main(String[] args){ShapeFactory cf = new CircleFactory();cf.getShape().draw();ShapeFactory rf = new RectangleFactory();rf.getShape().draw();} }
結果是: I can draw a circle. I can draw a rectangle. 工廠方法模式通過多個實現抽象工廠的具體工廠,為簡單工廠模式的工廠類分擔了壓力,當有新的Shape產生時,只需創建一個 具體工廠類和具體產品類,無需修改原有的代碼,復合六大原則的開閉原則。 以上就是簡單工廠模式和工廠方法模式,抽象工廠模式將放到下一小節。
總結
以上是生活随笔為你收集整理的Java设计模式(一) -- 工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式中的六大设计原则
- 下一篇: Java设计模式(二) -- 单例模式