設計模式-建立型模式-工廠模式(工廠三兄弟)
工廠模式分爲簡單工廠,工廠方法,抽象工廠。設計模式
一個接口,三個具體類,一個工廠,經過選擇,生產出對應的對象。ide
package demo2; public class Circle implements Shape{ public Circle() { } @Override public void draw() { } }
package demo2; public class Rectangle implements Shape{ public Rectangle() { } @Override public void draw() { } }
package demo2; public interface Shape { void draw(); }
package demo2; public class ShapeFactory { public static Shape getShape(String shapeType) { if(shapeType == null) { return null; } if (shapeType == "Circle") { return new Circle(); } if (shapeType == "Rectangle") { return new Rectangle(); } if (shapeType == "Square") { return new Square(); } return null; } }
package demo2; public class Square implements Shape{ public Square() { } @Override public void draw() { } }
package demo2; public class Test { public static void main(String[] agrs) { Shape circle = new ShapeFactory().getShape("Circle"); circle.draw(); } }
因爲違反開放-封閉原則,每次都要去修改源代碼,因此直接使用反射機制。
將類傳入,使用泛型+反射,生產出對象。設計
package demo2; public class ShapeFactory2 { @SuppressWarnings("deprecation") public static Object getClass(Class<? extends Shape> clazz) { // 表明通配的是Shape的子類,即都爲藉口的子類 Object obj = null; try { obj = Class.forName(clazz.getName()).newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return obj; } }
package demo2; public class Test { public static void main(String[] agrs) { Shape circle = (Circle)ShapeFactory2.getClass(Circle.class); circle.draw(); } }
每一個對象有對應的工廠,將原先的工廠拆分。code
package demo2; public class CircleFactory implements Factory{ @Override public Shape getShape() { return new Circle(); } }
package demo2; public class RectangleFactory implements Factory{ @Override public Shape getShape() { return new Rectangle(); } }
package demo2; public class SquareFactory implements Factory{ @Override public Shape getShape() { return new Square(); } }
package demo2; public class Test { public static void main(String[] agrs) { Factory circleFactory = new CircleFactory(); Shape circle = circleFactory.getShape(); circle.draw(); } }
兩個抽象接口,一個爲產品,一個爲工廠,進行生產對象
槍接口
public interface Gun{ public void shooting(); }
子彈ci
public interface Bullet{ public void load(); }
ak類get
public class AK implements Gun{ @Override public void shooting(){}; }
對應子彈產品
public class AK_Bullet implements Bullet{ @Override public void load(){}; }
m4io
public class M4 implements Gun{ @Override public void shooting(){}; }
對應子彈
public class M4_Bullet implements Bullet{ @Override public void load(){}; }
public interface Factory{ public Gun produceGun(); public Bullet produceBullet(); }
具體工廠
ak
public class AK_Factory implements Factory { @Override public Gun produceGun(){ return new AK(); } @Override public Bullet produceBullet(){ return new AK_Bullete(); } }
M4
public class M4_Factory implements Factory{ @Override public Gun produceGun(){ return new M4(); } @Override public Bullet produceBullet(){ return new M4_Bullet(); } }
www.iming.info