核心代碼:(簡單工廠)
package com.factory;/*
*@author:
*@time
*/
import com.entity.Aodi;
import com.entity.Byd;
import com.entity.Car;
public class CarFactory {
public Car getCar(String type){
if("奧迪".equals(type)){
return Aodi.getInstance();
}
else if("比亞迪".equals(type)){
return Byd.getInstance();
}
else
return null;
}
}
把創建實例的工作交給工廠去完成,不再由客戶直接接觸實例,客戶不再需要車怎麼創建,只需要向工廠提出對某種車的需求(上述代碼中通過getCar()方法傳入對車的需求),具體的創建由工廠自己完成。如下:
public static void main(String[] args) {
Car car=new CarFactory().getCar("比亞迪");
car.run();
}
方法工廠模式;
/**
* 工廠方法模式,實現了開閉原則,有利於功能的擴展
*/
public static void test2(){
Car car1=new BydFactory().getCar();
Car car2=new BaomaFactory().getCar();
Car car3=new AodiFactory().getCar();
car1.run();
car2.run();
car3.run();
}
//工廠方法模式每個車的新建都在自己的工廠創建,有新車時只需添加相應的工廠,無需改動其他代碼
import com.entity.Aodi;
import com.entity.Car;
public class AodiFactory {
public Car getCar(){
return Aodi.getInstance();
}
}
實體(單例模式):
餓漢式:
package com.entity;/*
*@author:
*@time
*/
public class Baoma implements Car{
private Baoma(){}
/**
* 餓漢式單例模式
*/
private static final Baoma instance=new Baoma();;
public static Baoma getInstance(){
return instance;
}
@Override
public void run() {
System.out.println("寶馬啓動了!");
}
@Override
public void stop() {
System.out.println("寶馬停車了!");
}
}
雙重檢查實現
package com.entity;/*
*@author:
*@time
*/
public class Aodi implements Car{
/**
* 雙重檢查實現單例模式
*/
private static volatile Aodi instance;
private Aodi(){}
public static Aodi getInstance(){
if(instance==null){
synchronized (Aodi.class){
if(instance==null){
instance=new Aodi();
return instance;
}
}
}
return instance;
}
@Override
public void run() {
System.out.println("奧迪啓動了!");
}
@Override
public void stop() {
System.out.println("奧迪停車了!");
}
}
靜態內部類實現:
package com.entity;/*
*@author:
*@time
*/
public class Byd implements Car {
/**
* 靜態內部類實現單例模式
*/
private static class bydClass{
private static Byd byd=new Byd();
}
public static Byd getInstance(){
return bydClass.byd;
}
private Byd(){}
@Override
public void run() {
System.out.println("比亞迪啓動了!");
}
@Override
public void stop() {
System.out.println("比亞迪停車了!");
}
}