工廠模式
工廠模式定義:**任何可以產生對象的方法或類,都可以稱之為工廠。**所以單例也是一種工廠。
工廠模式把原來new對象的方式,換成了用工廠來實現。為什么有了new之后,還要有工廠?是為了靈活控制生產過程,還可以控制對象訪問權限,給對象添加修飾和日志等。
工廠系列的設計模式有:
簡單工廠
靜態工廠
工廠方法
抽象工廠
舉例:用面向對象多態的方式,實現任意定制交通工具。
public interface Moveable { void go();}public class Plane implement Moveable { public void go() { System.out.println("plane flying shuashua....."); }}public class Car implement Moveable { public void go() { System.out.println("Car go wuwuwuwuwu....."); }}public class Broom implement Moveable { public void go() { System.out.println("Broom flying chuachua....."); }}public class Main { public static void main(String[] args) { Moveable m = new Plane(); m.go(); }}
以上小程序中,plane、car、broom都實現了Moveable接口,當我想換一種工具,只要換一個對象就好了,不需要重新new對象了。
簡單工廠
當我們new一個交通工具的時候,如果有控制權限的要求,而每個對象的權限是不一樣的。飛機有飛機的權限,汽車有汽車的權限。這時候用簡單的面向對象的方式就不合適了。這時候就要用工廠,讓產生對象的過程不用new,交給工廠處理。因為工廠可以靈活的控制生產過程,定制權限、修飾、日志。
舉例:簡單工廠
//交通工具工廠public class SimpleVehicleFactory { public Car createCar() { //before processing 前置處理 return new Car(); } public Broom createBroom() { //before processing 前置處理 return new Broom(); } public Plane createPlane() { //before processing 前置處理 return new Plane(); }}
簡單工廠的可擴展性不好,每當我們添加一種交通工具,都要重新寫一個方法,方法里面的東西都要重寫。
工廠方法
我們可以針對每一種產品來做一個工廠。這種方法叫工廠方法。
舉例:工廠方法,實現任意定制生產過程。
public class CarFactory { public Car create() { System.out.println("a car created!"); return new Car(); }}public class Main { public static void main(String[] args) { Moveable m = new CarFactory().create(); m.go(); }}
針對汽車,做一個汽車工廠,在里面添加new汽車的方法,以及new汽車的權限和日志等。當需要汽車時,只需要調用工廠的方法。當有很多種交通工具,每種交通工具都做一個工廠。
抽象工廠
上面介紹了用工廠模式任意定制交通工具和任意定制生產過程,工廠模式還可以任意定制產品一族。
汽車、AK47、wdm(味多美) 是一個族:現代族
public class Car { public void go() { System.out.println("Car go wuwuwuwuwu....."); }}public class AK47 { public void shoot() { System.out.println("tutututu....."); }}public class Bread { public void printName() { System.out.println("wdm"); }}public static void main(String[] args) { Car c = new Car(); c.go(); AK47 w = new AK47(); w.shoot(); Bread b = new Bread(); b.printName();}
笤帚、魔法棒、dmg(毒蘑菇)是一族:魔法族
public class Broom { public void go() { System.out.println("Broom flying chuachua....."); }}public class MagicStick { public void shoot() { System.out.println("diandain....."); }}public class MushRoom { public void printName() { System.out.println("dmg"); }}public static void main(String[] args) { Broom b = new Broom(); b.go(); MagicStick m = new MagicStick(); m.shoot(); MushRoom r = new MushRoom(); r.printName();}
現在我們已經定義好了兩個產品族,現代族和魔法族。但是每當我想換一個族,都要改很多代碼。如果我想再添加一個產品族的時候,不需要添加很多代碼,也不要修改很多地方。這是要用到抽象工廠。
舉例:抽象工廠,實現任意定制產品一族
//抽象工廠public abstract class AbstracFactory { //這個抽象的工廠,會生產3個抽象的產品 abstract Food createFood(); abstract Vehicle createVehicle(); abstract Weapon createWeapon();}public abstract class Food { abstract void printName();}public abstract class Weapon { abstract void shoot();}public abstract class Vehicle { abstract void go();}//現代工廠,繼承抽象工廠,生產現代族的產品public class ModernFactory extends AbstractFactory { @Override Food createFood() { return new Bread(); } @Override Food createVehicle() { return new Car(); } @Override Food createWeapon() { return new AK47(); }}//魔法工廠,繼承抽象工廠,生產魔法族的產品 public class MagicFactory extends AbstractFactory { @Override Food createFood() {return new MushRoom(); } @Override Food createVehicle() {return new Broom(); } @Override Food createWeapon() {return new MagicStick(); }}public static void main(String[] args) { AbstractFactory f = new ModernFactory(); Vehicle c = f.createVehicle(); c.go(); Weapon w = f.createWeapon(); w.shoot(); Food b = f.createFood(); b.printName();}
另外汽車和笤帚繼承Vehicle,AK47和魔法棒繼承Weapon,wdm和dmg繼承Food。代碼簡單就我不寫了。
抽象工廠的結構是:
抽象工廠(AbstracFactory)可以生產Vehicle、Weapon、Food這三個抽象的東西。
具體工廠 繼承抽象工廠(AbstracFactory),具體工廠生產具體的東西,汽車、AK47等,這些東西都是從抽象工廠生產的抽象的東西繼承。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。