設計模式-建立型模式-工廠模式(工廠三兄弟)
阿新 • • 發佈:2018-11-27
設計模式-建立型模式-工廠模式(工廠三兄弟)
工廠模式分為簡單工廠,工廠方法,抽象工廠。
簡單工廠模式
一個介面,三個具體類,一個工廠,通過選擇,生產出對應的物件。
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();
}
}
工廠方法
每個物件有對應的工廠,將原先的工廠拆分。
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();
}
子彈
public interface Bullet{
public void load();
}
ak類
public class AK implements Gun{
@Override
public void shooting(){};
}
對應子彈
public class AK_Bullet implements Bullet{
@Override
public void load(){};
}
m4
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