工廠模式
實例化對象不使用new,用工廠方法實現
將選擇實現類,創建對象統一管理和控制。從而將調用者跟實現類解耦
三種模式
簡單工廠模式
工廠方法模式
抽象工廠模式
應用場景
- JDK中的Calendar的getInstance()方法
- JDBC中的Connection對象的獲取
- Spring中IOC容器管理bean對象
- 反射中Class對象的newInstance方法
小結
- 簡單工廠模式(靜態工廠模式)
雖然某種程度上不符合設計原則,但實際使用最多
- 工廠方法模式
不修改已知類的前提下,通過增加新的工廠類實現擴展
- 抽象工廠模式
不可以增加產品,可以增加產品族
實現之車工廠
簡單工廠模式
Car.java
package com.li.factory.simple;
public interface Car {
void name();
}
WuLing.java
package com.li.factory.simple;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
Tesla.java
package com.li.factory.simple;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
Dazhong.java
package com.li.factory.simple;
public class Dazhong implements Car {
@Override
public void name() {
System.out.println("大衆!");
}
}
CarFactory.java
package com.li.factory.simple;
//簡單工廠模式也稱靜態工廠模式
//增加一個新的產品,如果不修改代碼,做不到!
//開閉原則
public class CarFactory {
//方法一
public static Car getCar(String car){
if(car.equals("五菱")){
return new WuLing();
}else if(car.equals("特斯拉")){
return new Tesla();
}else {
return null;
}
}
//方法二
public static Car getWuling(){
return new WuLing();
}
public static Car getTesla(){
return new Tesla();
}
}
測試
Consumer.java
package com.li.factory.simple;
public class Comsumer {
public static void main(String[] args) {
//接口,所有的實現類!工廠
//Car car = new WuLing();
// Car car2 = new Tesla();
//使用工廠創建
Car car = CarFactory.getCar("五菱");
Car car2 = CarFactory.getCar("特斯拉");
car.name();
car2.name();
}
}
控制檯
工廠方法模式
Car.java
package com.li.factory.simple;
public interface Car {
void name();
}
WuLing.java
package com.li.factory.method;
public class WuLing implements Car {
@Override
public void name() {
System.out.println("五菱宏光!");
}
}
Tesla.java
package com.li.factory.method;
public class Tesla implements Car {
@Override
public void name() {
System.out.println("特斯拉!");
}
}
MoBai.java
package com.li.factory.method;
public class MoBai implements Car {
@Override
public void name() {
System.out.println("摩拜單車!");
}
}
CarFactory.java
package com.li.factory.method;
public interface CarFactory {
Car getCar();
}
WuLingFactory.java
package com.li.factory.method;
public class WuLingFactory implements CarFactory {
@Override
public Car getCar() {
return new WuLing();
}
}
TeslaFactory.java
package com.li.factory.method;
public class TeslaFactory implements CarFactory {
@Override
public Car getCar() {
return new Tesla();
}
}
MoBaiFactory.java
package com.li.factory.method;
public class MoBaiFactory implements CarFactory {
@Override
public Car getCar() {
return new MoBai();
}
}
測試
Comsumer.java
package com.li.factory.method;
public class Comsumer {
public static void main(String[] args) {
Car car = new WuLingFactory().getCar();
Car car2 = new TeslaFactory().getCar();
car.name();
car2.name();
Car car3 = new MoBaiFactory().getCar();
car3.name();
}
//結構複雜度:sample
//代碼複雜度:sample
//編程複雜度:sample
//管理上的複雜度: sample
//根據設計原則: 工廠方法模式!
//根據實際業務: 簡單工廠模式!
}
控制檯