工廠模式
定義車的抽象類,有一個行駛的方法,所有的車都繼承這個類
/**
* Car 抽象類
*/
public abstract class Car {
public abstract void run();
}
定義兩輛車,奔馳和本田,繼承Car 抽象類並實現run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("開着奔馳去泡妞...");
}
}
public class BenTian extends Car {
@Override
public void run() {
System.out.println("開着本田去上班...");
}
}
創建工廠類,負責生成汽車,如果想創建汽車就使用這個類,不用自己去new了
/**
* Car的工廠類,負責生成各種汽車
*/
public class CarFactory {
public static Car createCar(String type){
if("奔馳".equals(type)){
return new BenChi();
}else if("本田".equals(type)){
return new BenTian();
}
return null;
}
}
測試類,想創建BenChi類時,無需 Car 奔馳 = new BenChi() ; 因爲創建的過程交給了CarFactory類
public class Test {
public static void main(String[] args) {
Car 奔馳 = CarFactory.createCar("奔馳");
奔馳.run();
Car 本田 = CarFactory.createCar("本田");
本田.run();
}
}
執行輸出
開着奔馳去泡妞...
開着本田去上班...
這就是一個工廠模式,但是有一個問題,我想增加一輛QQ車時要修改CarFactory類,這樣不太好吧,寫好的代碼不應該經常修改,所以可以使用工廠方法模式。
工廠方法模式
定義生成車的接口
public interface CarFactory {
public Car createCar();
}
創建生成XX車的工廠類,並實現CarFactory接口
/**
* 生成奔馳的工廠類
*/
public class BenChiFactory implements CarFactory {
@Override
public Car createCar() {
return new BenChi();
}
}
/**
* 生成本田的工廠類
*/
public class BenTianFactory implements CarFactory{
@Override
public Car createCar() {
return new BenTian();
}
}
/**
* 生成QQ的工廠類
*/
public class QQFactory implements CarFactory{
@Override
public Car createCar() {
return new QQ();
}
}
定義車的抽象類,有一個行駛的方法,所有的車都繼承這個類
/**
* Car 抽象類
*/
public abstract class Car {
public abstract void run();
}
創建輛車,奔馳,本田,QQ,繼承Car 抽象類並實現run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("開着奔馳去泡妞...");
}
}
public class BenTian extends Car {
@Override
public void run() {
System.out.println("開着本田去上班...");
}
}
public class QQ extends Car{
@Override
public void run() {
System.out.println("開着QQ送快遞...");
}
}
測試類
public class Test {
public static void main(String[] args) {
CarFactory 奔馳工廠 = new BenChiFactory();
Car 奔馳 = 奔馳工廠.createCar();
奔馳.run();
CarFactory 本田工廠 = new BenTianFactory();
Car 本田 = 本田工廠.createCar();
本田.run();
CarFactory QQ工廠= new QQFactory();
Car qq = QQ工廠.createCar();
qq.run();
}
}
結果
開着奔馳去泡妞...
開着本田去上班...
開着QQ送快遞...
以後再新加車時,不需要修改以前寫好的代碼,只需要新建XXFactory實現CarFactory接口,和創建XX車類繼承Car重寫run()方法,這樣就避免了修改以前的代碼可能導致其他問題的發生
抽象工廠
定義抽象工廠接口AbstractFactory有兩個方法
public interface AbstractFactory {
public Car createCar();
public Mobile createMobile();
}
定義手機和汽車的抽象類
public abstract class Mobile {
public abstract void call();
}
public abstract class Car {
public abstract void run();
}
建一個生產高帥富的工廠類並實現AbstractFactory接口,這個工廠將生產奔馳車和蘋果手機
/**
* 高帥富工廠
*/
public class GaoShuaiFuFactory implements AbstractFactory{
@Override
public Car createCar() {
return new BenChi();
}
@Override
public Mobile createMobile() {
return new Iphone();
}
}
創建蘋果手機類Iphone繼承Mobile類,重寫call()方法
public class Iphone extends Mobile{
@Override
public void call() {
System.out.println("用蘋果手機打電話");
}
}
創建奔馳類繼承Car類,重寫run()方法
public class BenChi extends Car {
@Override
public void run() {
System.out.println("開着奔馳去泡妞...");
}
}
測試類
public class Test {
public static void main(String[] args) {
AbstractFactory abstractFactory = new GaoShuaiFuFactory();
Car car = abstractFactory.createCar();
car.run();
Mobile mobile = abstractFactory.createMobile();
mobile.call();
}
}
執行控制檯輸出
開着奔馳去泡妞...
用蘋果手機打電話
接下來我們把高帥富換成屌絲,屌絲開QQ,用小米手機
/**
* 屌絲工廠
*/
public class DiaoSiFactory implements AbstractFactory{
@Override
public Car createCar() {
return new QQ();
}
@Override
public Mobile createMobile() {
return new XiaoMi();
}
}
創建小米手機類XiaoMi繼承Mobile類,重寫call()方法
public class XiaoMi extends Mobile{
@Override
public void call() {
System.out.println("用小米手機打電話");
}
}
創建QQ類繼承Car類,重寫run()方法
public class QQ extends Car{
@Override
public void run() {
System.out.println("開着QQ送快遞...");
}
}
測試類,只需要將GaoShuaiFuFactory類換成DiaoSiFactory類就行了,如果使用spring的getbean形式,代碼是不需要改的
public class Test {
public static void main(String[] args) {
// AbstractFactory abstractFactory = new GaoShuaiFuFactory();
AbstractFactory abstractFactory = new DiaoSiFactory();
Car car = abstractFactory.createCar();
car.run();
Mobile mobile = abstractFactory.createMobile();
mobile.call();
}
}
控制檯輸出
開着QQ送快遞...
用小米手機打電話