工廠:故名思議,就是用來制造各種產(chǎn)品的,在程序中主要是用來創(chuàng)建對象。
- 首先介紹下簡單工廠(也稱靜態(tài)工廠)
class Car{
public void run(){
System.out.println("小車正在跑。。");
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//調(diào)用者創(chuàng)建一個(gè)Car
Car car = new Car();
//調(diào)用者調(diào)用run方法
car.run();
}
}
通過以上代碼,你有沒有發(fā)現(xiàn)一個(gè)問題。就是調(diào)用者(main方法)在調(diào)用小車的run()之前還需要?jiǎng)?chuàng)建一個(gè)Car對象,就好比你想要開車,你會(huì)不會(huì)自己先做一輛車然后再去開?我想你不會(huì)的。所以為了讓調(diào)用者和創(chuàng)建者分離,工廠設(shè)計(jì)模式應(yīng)允而生。
class Car{
public void run(){
System.out.println("小車正在跑。。");
}
}
/**
* 汽車工廠
*
*/
class CarFactory{
//加上static方便調(diào)用,也稱靜態(tài)工廠
public static Car createCar(){
return new Car();
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//通過工廠創(chuàng)建一個(gè)Car
Car car = CarFactory.createCar();
//調(diào)用者調(diào)用run方法
car.run();
}
}
實(shí)際應(yīng)用當(dāng)然不止才一個(gè)類型的車,下面是一個(gè)詳細(xì)的例子:
interface Car{
public void run();
}
class Benz implements Car{
@Override
public void run() {
System.out.println("奔馳在跑...");
}
}
class Bmw implements Car{
@Override
public void run() {
System.out.println("寶馬在跑...");
}
}
/**
* 汽車工廠
*
*/
class CarFactory{
/**
* 簡單工廠一般加上static方便訪問
* 通過不同類型獲得不同的車
* @param type 類型
* @return 車
*/
public static Car createCar(String type){
Car car = null;
if(type.equals("benz")){
car = new Benz();
} else if(type.equals("bmw")){
car = new Bmw();
}
return car;
}
}
/**
* 也可以為每一種汽車寫一個(gè)單獨(dú)的方法
*/
class CarFactory2{
/**
* 簡單工廠一般加上static方便訪問
* 通過不同類型獲得不同的車
* @param type 類型
* @return 車
*/
public static Car createBenz(){
return new Benz();
}
public static Car createBmw(){
return new Bmw();
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//通過工廠創(chuàng)建一個(gè)Benz
//Car benz = CarFactory.createCar("benz");
//Car bmw = CarFactory.createCar("bmw");
Car benz = CarFactory2.createBenz();
Car bmw = CarFactory2.createBmw();
//調(diào)用者調(diào)用run方法
benz.run();
bmw.run();
}
}
到這里一個(gè)簡單工廠的實(shí)現(xiàn)已經(jīng)完成,但是現(xiàn)在會(huì)有一個(gè)新的問題,當(dāng)你要新增Car的時(shí)候,勢必要去修改工廠方法來適應(yīng)新的需求,這樣便破壞了Open-closed Principle,下面是修改后的:
interface Car{
public void run();
}
class Benz implements Car{
@Override
public void run() {
System.out.println("奔馳在跑...");
}
}
class Bmw implements Car{
@Override
public void run() {
System.out.println("寶馬在跑...");
}
}
/**
* 將工廠抽象為接口
*
*/
interface CarFactory{
Car createCar();
}
/**
* 奔馳工廠
*
*/
class BenzFactory implements CarFactory{
@Override
public Car createCar() {
return new Benz();
}
}
/**
* 寶馬工廠
*
*/
class BmwFactory implements CarFactory{
@Override
public Car createCar() {
return new Bmw();
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//通過工廠創(chuàng)建對象
Car benz = new BenzFactory().createCar();
Car bmw = new BmwFactory().createCar();
//調(diào)用者調(diào)用run方法
benz.run();
bmw.run();
}
}
以上就是工廠方法模式,和簡單工廠略有不同,通過抽象工廠為接口解決了OCP,現(xiàn)在的這個(gè)工廠變得更好擴(kuò)展了,但其實(shí)這種寫法復(fù)雜了很多,還是看你怎么取舍了吧。