簡單工廠設計模式的小case.
阿新 • • 發佈:2018-12-06
工廠設計模式是23中GOF設計模式中最常用的的一個設計模式。spring架構中也有很多介面的設計用到此種設計模式:今天就總結一下這個設計模式並手寫一個小案例:
圖形畫的那叫一個醜。幫助理解。意思意思。
FactoryProvier:提供一個靜態方法,接受一個EnumFactoryType的引數,返回具體的工廠例項。程式碼如下:
package top.lrshuai.helloword.controller.factory; import top.lrshuai.helloword.controller.common.EnumFactoryType; /** * : 描述資訊 * * @author liyy * @date 2018-11-19 10:20 */ public class FactoryProvider { public static GraphicsFactory getFactory(EnumFactoryType factoryType){ if(factoryType==EnumFactoryType.TWOD_FACTORY){ return new TwoDGraphicsFactroy(); }else if(factoryType==EnumFactoryType.THREED_FACTORY){ return new ThreeDGraphicsFactory(); } return null; } }
GraphicsFactory :工廠介面,提供一個抽象的方法,接受一個EnumGraphicsType型別引數。返回一個Graphics物件,需要具體的實現,程式碼如下:
package top.lrshuai.helloword.controller.factory; import top.lrshuai.helloword.controller.common.EnumGraphicsType; import top.lrshuai.helloword.controller.entity.Graphics; /** * : 描述資訊 * * @author liyy * @date 2018-11-19 10:14 */ public interface GraphicsFactory { public Graphics getGraphics(EnumGraphicsType graphicsType); }
TwoDGraphicsFactory ThreeDGraphicsFactory分別實現GraphicsFactory介面,並實現具體的邏輯程式碼:
package top.lrshuai.helloword.controller.factory; import top.lrshuai.helloword.controller.common.EnumGraphicsType; import top.lrshuai.helloword.controller.entity.Circle; import top.lrshuai.helloword.controller.entity.Graphics; import top.lrshuai.helloword.controller.entity.Line; /** * : 描述資訊 * * @author liyy * @date 2018-11-19 10:18 */ public class TwoDGraphicsFactroy implements GraphicsFactory { @Override public Graphics getGraphics(EnumGraphicsType graphicsType) { if(graphicsType==EnumGraphicsType.LINE){ return new Line(); }else if(graphicsType== EnumGraphicsType.CIRCLE){ return new Circle(); } return null; } } package top.lrshuai.helloword.controller.factory; import top.lrshuai.helloword.controller.common.EnumGraphicsType; import top.lrshuai.helloword.controller.entity.Circle; import top.lrshuai.helloword.controller.entity.Graphics; import top.lrshuai.helloword.controller.entity.Line; import top.lrshuai.helloword.controller.entity.PersonPhoto; /** * GraphicsFactory: 描述資訊 * * @author liyy * @date 2018-11-19 10:18 */ public class ThreeDGraphicsFactory implements GraphicsFactory { @Override public Graphics getGraphics(EnumGraphicsType graphicsType) { if(graphicsType==EnumGraphicsType.PERSONPHOTO){ return new PersonPhoto(); } return null; } }
Graphics:抽象類圖形,提供一個抽象的方法draw()方法。
package top.lrshuai.helloword.controller.entity;
/**
* 圖形: 描述資訊
*
* @author liyy
* @date 2018-11-19 10:10
*/
public abstract class Graphics {
public abstract void draw();
}
Line Circle PersonPhoto子類繼承Graphics,並重寫父類的方法實現具體的邏輯程式碼:
package top.lrshuai.helloword.controller.entity;
/**
* 圓形圖: 描述資訊
*
* @author liyy
* @date 2018-11-19 10:07
*/
public class Circle extends Graphics{
@Override
public void draw(){
System.out.println("draw circle....");
}
}
package top.lrshuai.helloword.controller.entity;
/**
* 線性圖: 描述資訊
*
* @author liyy
* @date 2018-11-19 10:06
*/
public class Line extends Graphics {
@Override
public void draw(){
System.out.println("down line......");
}
}
package top.lrshuai.helloword.controller.entity;
/**
* 人形圖: 描述資訊
*
* @author liyy
* @date 2018-11-19 10:08
*/
public class PersonPhoto extends Graphics {
@Override
public void draw(){
System.out.println("draw PersonPhoto....");
}
}
下面是測試類:
package top.lrshuai.helloword.controller.test;
import top.lrshuai.helloword.controller.common.EnumFactoryType;
import top.lrshuai.helloword.controller.common.EnumGraphicsType;
import top.lrshuai.helloword.controller.entity.Graphics;
import top.lrshuai.helloword.controller.factory.FactoryProvider;
import top.lrshuai.helloword.controller.factory.GraphicsFactory;
/**
* : 描述資訊
*
* @author liyy
* @date 2018-11-19 10:32
*/
public class Test {
public static void main(String[] args){
GraphicsFactory factory = FactoryProvider.getFactory(EnumFactoryType.TWOD_FACTORY);
if(factory!=null){
Graphics graphics = factory.getGraphics(EnumGraphicsType.LINE);
if(graphics!=null){
graphics.draw();
}else{
System.out.println("沒有獲取到對應的畫圖物件");
}
}else{
System.out.println("沒有獲取到對應的工廠物件");
}
}
}
共涉及到一個介面。一個抽象類 介面的兩個實現。抽象類的三個繼承。一個靜態工廠提供入口