设计模式-建立型模式-工厂模式(工厂三兄弟)
工厂模式分为简单工厂,工厂方法,抽象工厂。设计模式
一个接口,三个具体类,一个工厂,经过选择,生产出对应的对象。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