納微半導體成立全球首家電動車氮化鎵功率晶片設計中心,650V GaN IC 已出樣
阿新 • • 發佈:2022-01-15
OOP七大原則
1、單例模式
核心作用:保證一個類只有一個例項,並且提供一個訪問該例項的全域性訪問點
餓漢模式
// 餓漢式單例
public class Hungry{
// 可能會浪費空間
private Hungry(){}
private final static Hungry HUNGRY = new Hungry();
public static Hungry getInstance(){
return HUNGRY;
}
}
懶漢模式
// 懶漢式單例 public class LazyMan{ private LazyMan(){} private volatile static LazyMan lazyMan; // 雙重檢測鎖模式的懶漢式單例 DCL 懶漢式 public static LazyMan getInstance(){ if(lazyMan==null){ synchronized (LazyMan.class){ if(lazyMan==null){ lazyMan = new LazyMan(); } } } return lazyMan; } }
靜態內部類單例
// 靜態內部類單例
public class Holder{
private Holder(){}
public static Holder getInstace(){
return InnerClass.HOLDER;
}
public static class InnerClass{
private static final Holder HOLDER = new Holder();
}
}
列舉單例
// enum 本身也是一個Class類 public enum EnumSingle{ INSTANCE; public EnumSingle getInstance(){ return INSTANCE; } }
2、工廠模式
作用:實現了建立者和呼叫者的分離
詳細分類:簡單工廠模式、工廠方法模式、抽象工廠模式
OOP七大原則:
開閉原則:一個軟體的實體應當對擴充套件開放,對修改關閉
依賴倒轉原則:要針對介面程式設計,不要針對實現程式設計
地米特法則:只與你直接的朋友通訊,而避免和陌生人通訊
簡單工廠模式
public interface Car{ void name(); } public class WuLing implements Car{ @Override public void name(){ System.out.println("五菱巨集光"); } } public class Tesla implements Car{ @Override public void name(){ System.out.println("特斯拉"); } } // 簡單工廠,靜態工廠模式 // 增加一個新的產品,如果你不修改程式碼,做不到 // 沒有滿足開閉原則 public class CarFactory{ public static Car getCar(String car){ if(car.equals("五菱")){ return new WuLing(); }else if(car.equals("特斯拉")){ return new Tesla(); }else{ return null; } } }
工廠方法模式
public interface Car{
void name();
}
public class WuLing implements Car{
@Override
public void name(){
System.out.println("五菱巨集光");
}
}
public class Tesla implements Car{
@Override
public void name(){
System.out.println("特斯拉");
}
}
// 工廠方法模式
public interface CarFactory{
Car getCar();
}
public class WuLingFactory implements CarFactory{
@Override
public Car getCar(){
return new WuLing();
}
}
public class TeslaFactory implements CarFactory{
@Override
public Car getCar(){
return new Tesla();
}
}
根據設計原則:工廠方法模式
根據實際業務:簡單工廠模式
抽象工廠模式
定義:抽象工廠模式提供了一個建立一系列相關或者相互依賴物件的介面,無需指定它們具體的類
// 手機產品介面
public interface IphoneProduct{
void start();
void shutdown();
void callup();
void sendSMS();
}
// 路由器產品介面
public interface IRouterProduct{
void start();
void shutdown();
void openWifi();
void setting();
}
// 小米手機
public class XiaomiPhone implements IphoneProduct{
@Override
public void start(){
System.out.println("開啟小米手機");
}
@Override
public void shutdown(){
System.out.println("關閉小米手機");
}
@Override
public void callup(){
System.out.println("小米打電話");
}
@Override
public void sendSMS(){
System.out.println("小米發簡訊");
}
}
// 華為手機
public class HuaweiPhone implements IphoneProduct{
@Override
public void start(){
System.out.println("開啟華為手機");
}
@Override
public void shutdown(){
System.out.println("關閉華為手機");
}
@Override
public void callup(){
System.out.println("華為打電話");
}
@Override
public void sendSMS(){
System.out.println("華為發簡訊");
}
}
// 小米路由器
public class XiaomiRouter implements IRouterProduct{
@Override
public void start(){
System.out.println("啟動小米路由器");
}
@Override
public void shutdown(){
system.out.println("關閉小米路由器");
}
@Override
public void openWifi(){
System.out.println("開啟小米wifi");
}
@Override
public void setting(){
System.out.println("小米設定");
}
}
// 華為路由器
public class HuaweiRouter implements IRouterProduct{
@Override
public void start(){
System.out.println("啟動華為路由器");
}
@Override
public void shutdown(){
system.out.println("關閉華為路由器");
}
@Override
public void openWifi(){
System.out.println("開啟華為wifi");
}
@Override
public void setting(){
System.out.println("華為設定");
}
}
// 抽象產品工廠
public interface IProductFactory{
// 生產手機
IphoneProduct iphoneProduct();
// 生產路由器
IRouterProduct routerProduct();
}
// 小米工廠
public class XiaomiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct(){
return new XiaomiPhone();
}
@Override
public IRouterProduct routerProduct(){
return new XiaomiRouter();
}
}
// 華為工廠
public class HuaweiFactory implements IProductFactory{
@Override
public IphoneProduct iphoneProduct(){
return new HuaweiPhone();
}
@Override
public IRouterProduct routerProduct(){
return new HuaweiRouter();
}
}
// 測試
public class Test{
public static void main(String[] args){
//建立小米工廠
XiaomiFactory xiaomiFactory = new XiaomiFactory();
IphoneProduct iphoneProduct = xiaomiFactory.iphoneProduct();
iphoneProduct.callup();
iphoneProduct.sendSMS();
IRouteProduct iRouterProduct = xiaomiFactory.routerProduct();
iRouterProduct.openWifi();
}
}
優點:
具體產品在應用層的程式碼隔離,無需關心建立細節
將一個系列的產品統一到一起建立
缺點:
規定了所有可能被建立的產品集合,產品簇中擴充套件最新的產品困難
增加了系統的抽象性和理解難度