1. 程式人生 > >java中工廠模式

java中工廠模式

工廠模式:

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"));
		
		//設計模式的經典之處,就在於,解決了編寫程式碼的人和呼叫程式碼的人雙方的痛處
		//解放我們的雙手
		
	}
}