java中工廠模式
阿新 • • 發佈:2018-12-10
工廠模式:
1.隱藏複雜的邏輯過程,只關心結果
分為:簡單工廠,工廠方法,抽象工廠
簡單工廠:
1.產品介面:
package com.gupaoedu.vip.factory;
//產品介面
//汽車需要滿足一定的標準
public interface Car {
//規定汽車的品牌
String getName();
}
2.具體的產品:
package com.gupaoedu.vip.factory; public class Audi implements Car{ @Override public String getName() { return "Audi"; } }
package com.gupaoedu.vip.factory;
public class Benz implements Car{
@Override
public String getName() {
return "Benz";
}
}
package com.gupaoedu.vip.factory;
public class Bmw implements Car{
@Override
public String getName() {
return "BMW";
}
}
3.簡單工廠
package com.gupaoedu.vip.factory.simple; import com.gupaoedu.vip.factory.Audi; import com.gupaoedu.vip.factory.Benz; import com.gupaoedu.vip.factory.Bmw; import com.gupaoedu.vip.factory.Car; //對於這個工廠來說(太強大了) //為什麼? //這個工廠啥都能幹(不符合現實) //編碼也是一種藝術(融匯貫通),藝術來源於生活,迴歸到生活的 public class SimpleFactory { //實現統一管理、專業化管理 //如果沒有工廠模式,小作坊,沒有執行標準的 //如果買到三無產品(沒有標準) //衛生監督局工作難度會大大減輕 //中國製造(按人家的標準執行) //中國製造向中國創造改變(技術不是問題了,問題是什麼?思維能力) //碼農就是執行標準的人 //系統架構師,就是制定標準的人 //不只做一個技術者,更要做一個思考者 public Car getCar(String name){ if("BMW".equalsIgnoreCase(name)){ //Spring中的工廠模式 //Bean //BeanFactory(生成Bean) //單例的Bean //被代理過的Bean //最原始的Bean(原型) //List型別的Bean //作用域不同的Bean //getBean //非常的紊亂,維護困難 //解耦(鬆耦合開發) return new Bmw(); }else if("Benz".equalsIgnoreCase(name)){ return new Benz(); }else if("Audi".equalsIgnoreCase(name)){ return new Audi(); }else{ System.out.println("這個產品產不出來"); return null; } } }
4.測試:
package com.gupaoedu.vip.factory.simple;
import com.gupaoedu.vip.factory.Car;
public class SimpleFactoryTest {
public static void main(String[] args) {
//這邊就是我們的消費者
Car car = new SimpleFactory().getCar("Audi");
System.out.println(car.getName());
}
}
工廠方法:
1.工廠介面
package factory.func; import factory.Car; //工廠介面,就定義了所有工廠的執行標準 public interface Factory { //符合汽車上路標準 //尾氣排放標準 //電子裝置安全係數 //必須配備安全系,安全氣囊 //輪胎的耐磨程度 Car getCar(); }
2.具體產品的工廠
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Audi;
import com.gupaoedu.vip.factory.Car;
public class AudiFactory implements Factory {
@Override
public Car getCar() {
return new Audi();
}
}
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Benz;
import com.gupaoedu.vip.factory.Car;
public class BenzFactory implements Factory {
@Override
public Car getCar() {
return new Benz();
}
}
package com.gupaoedu.vip.factory.func;
import com.gupaoedu.vip.factory.Bmw;
import com.gupaoedu.vip.factory.Car;
public class BmwFactory implements Factory {
@Override
public Car getCar() {
return new Bmw();
}
}
3.工廠測試
package com.gupaoedu.vip.factory.func;
public class FactoryTest {
public static void main(String[] args) {
//工廠方法模式
//各個產品的生產商,都擁有各自的工廠
//生產工藝,生成的高科技程度都是不一樣的
Factory factory = new AudiFactory();
System.out.println(factory.getCar());
//需要使用者關心,這個產品的生產商
factory = new BmwFactory();
System.out.println(factory.getCar());
//增加的程式碼的使用複雜度
//抽象工廠模式
}
}
抽象工廠
1.抽象工廠類
package factory.abstr;
import factory.Car;
public abstract class AbstractFactory {
protected abstract Car getCar();
//這段程式碼就是動態配置的的功能
//固定模式的委派
public Car getCar(String name){
if("BMW".equalsIgnoreCase(name)){
return new BmwFactory().getCar();
}else if("Benz".equalsIgnoreCase(name)){
return new BenzFactory().getCar();
}else if("Audi".equalsIgnoreCase(name)){
return new AudiFactory().getCar();
}else{
System.out.println("這個產品產不出來");
return null;
}
}
}
2.具體工廠
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Audi;
import com.gupaoedu.vip.factory.Car;
//具體的業務邏輯封裝
public class AudiFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Audi();
}
}
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Benz;
import com.gupaoedu.vip.factory.Car;
public class BenzFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Benz();
}
}
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Bmw;
import com.gupaoedu.vip.factory.Car;
public class BmwFactory extends AbstractFactory {
@Override
public Car getCar() {
return new Bmw();
}
}
3.預設的工廠解決抽象類不能例項化的問題
package com.gupaoedu.vip.factory.abstr;
import com.gupaoedu.vip.factory.Car;
public class DefaultFactory extends AbstractFactory {
private AudiFactory defaultFactory = new AudiFactory();
public Car getCar() {
return defaultFactory.getCar();
}
}
4.測試
package com.gupaoedu.vip.factory.abstr;
public class AbstractFactoryTest {
public static void main(String[] args) {
AbstractFactory factory = new DefaultFactory();
System.out.println(factory.getCar("Benz"));
//設計模式的經典之處,就在於,解決了編寫程式碼的人和呼叫程式碼的人雙方的痛處
//解放我們的雙手
}
}