工廠:故名思議,就是用來(lái)制造各種產(chǎn)品的,在程序中主要是用來(lái)創(chuàng)建對(duì)象涧卵。
- 首先介紹下簡(jiǎn)單工廠(也稱靜態(tài)工廠)
class Car{
public void run(){
System.out.println("小車(chē)正在跑。腹尖。");
}
}
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();
}
}
通過(guò)以上代碼柳恐,你有沒(méi)有發(fā)現(xiàn)一個(gè)問(wèn)題。就是調(diào)用者(main方法)在調(diào)用小車(chē)的run()之前還需要?jiǎng)?chuàng)建一個(gè)Car對(duì)象桐臊,就好比你想要開(kāi)車(chē)胎撤,你會(huì)不會(huì)自己先做一輛車(chē)然后再去開(kāi)晓殊?我想你不會(huì)的断凶。所以為了讓調(diào)用者和創(chuàng)建者分離,工廠設(shè)計(jì)模式應(yīng)允而生巫俺。
class Car{
public void run(){
System.out.println("小車(chē)正在跑认烁。。");
}
}
/**
* 汽車(chē)工廠
*
*/
class CarFactory{
//加上static方便調(diào)用介汹,也稱靜態(tài)工廠
public static Car createCar(){
return new Car();
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//通過(guò)工廠創(chuàng)建一個(gè)Car
Car car = CarFactory.createCar();
//調(diào)用者調(diào)用run方法
car.run();
}
}
實(shí)際應(yīng)用當(dāng)然不止才一個(gè)類(lèi)型的車(chē)却嗡,下面是一個(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("寶馬在跑...");
}
}
/**
* 汽車(chē)工廠
*
*/
class CarFactory{
/**
* 簡(jiǎn)單工廠一般加上static方便訪問(wèn)
* 通過(guò)不同類(lèi)型獲得不同的車(chē)
* @param type 類(lèi)型
* @return 車(chē)
*/
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;
}
}
/**
* 也可以為每一種汽車(chē)寫(xiě)一個(gè)單獨(dú)的方法
*/
class CarFactory2{
/**
* 簡(jiǎn)單工廠一般加上static方便訪問(wèn)
* 通過(guò)不同類(lèi)型獲得不同的車(chē)
* @param type 類(lèi)型
* @return 車(chē)
*/
public static Car createBenz(){
return new Benz();
}
public static Car createBmw(){
return new Bmw();
}
}
public class SampleFactoryTest {
public static void main(String[] args) {
//通過(guò)工廠創(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è)簡(jiǎn)單工廠的實(shí)現(xiàn)已經(jīng)完成,但是現(xiàn)在會(huì)有一個(gè)新的問(wèn)題嘹承,當(dāng)你要新增Car的時(shí)候窗价,勢(shì)必要去修改工廠方法來(lái)適應(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) {
//通過(guò)工廠創(chuàng)建對(duì)象
Car benz = new BenzFactory().createCar();
Car bmw = new BmwFactory().createCar();
//調(diào)用者調(diào)用run方法
benz.run();
bmw.run();
}
}
以上就是工廠方法模式撼港,和簡(jiǎn)單工廠略有不同,通過(guò)抽象工廠為接口解決了OCP骤竹,現(xiàn)在的這個(gè)工廠變得更好擴(kuò)展了帝牡,但其實(shí)這種寫(xiě)法復(fù)雜了很多,還是看你怎么取舍了吧蒙揣。