单例模式和模版模式
單例模式
- 單例設計模式
- 目的——讓類 創建的對象,在系統中只有唯一的一個實例
- 每一次執行 類名() 返回的對象,內存地址是相同的
__new__方法
-
使用類名()創建對象時, Python 的解釋器首先會調用 __new__ 方法為對象 分配空間
-
__new__ 是一個 由 object 基類提供的內置的靜態方法,主要作用有兩個:
- 1)在內存中為對象分配空間
- 2)返回 對象的引用
-
Python 的解釋器獲得對象的 引用 后,將引用作為 第一個參數,傳遞給 __init__方法
-
重寫 __new__ 方法一定要 return super(). __new__ (cls)
-
否則 Python 的解釋器 得不到 分配了空間的 兌現引用,就不會調用對象的初始化方法
-
注意: __new__ 是一個靜態方法,在調用時需要 主動傳遞 cls參數
Python 中的單例
- 單例——讓 類 創建的對象,在系統中 只有唯一的一個實例
1.定義一個 類屬性,初始值是 None, 用于記錄 單例對象的引用
2.重寫__new__方法
3.如果 類屬性 is None, 調用父類方法分配空間,并在類屬性中記錄結果
4.返回類屬性中記錄的對象引用
只執行一次初始化工作
- 在每次使用 類名() 創建對象時,Python的解釋器都會自動調用兩個方法:
- __new__分配空間
- __init__對象初始化
示例:
class MusicPlayer(object):# 記錄第一個被創建對象的引用instance = None# 記錄是否執行過初始化動作init_flag = Falsedef __new__(cls, *args, **kwargs):# 1. 判斷類屬性是否是空對象if cls.instance is None:# 2.調用父類的方法,為第一個對象分配空間cls.instance = super().__new__(cls)# 3.返回類屬性保存的對象引用return cls.instancedef __init__(self):# 1.判斷是否執行過初始化動作if MusicPlayer.init_flag:return# 2.如果沒有執行過,在執行初始化動作print("初始化播放器")# 3.修改類屬性的標記MusicPlayer.init_flag = True# 創建多個對象 player1 = MusicPlayer() print(player1)player2 = MusicPlayer() print(player2)Java餓漢式
餓漢式是單例類被加載的時候就去創建一個單例實例
public class Main {public static void main(String[] args) {//創建單例餓漢對象HungryMan test1 = HungryMan.getEHan();System.out.println(test1);// 每次創建對象調用的都是同一個地址HungryMan test2 = HungryMan.getEHan();System.out.println(test2);} } public class HungryMan {/***單例模式餓漢模式*///創建一個私有的靜態屬性(使用引用類型)private static HungryMan hungryMan;//創建一個私有化構造器private HungryMan(){System.out.println("構造器被調用");}//創建一個公共訪問的靜態方法public static HungryMan getEHan(){if (hungryMan == null){hungryMan = new HungryMan();}return hungryMan;} }Java懶漢式
懶漢式是在真正需要的時候才去創建單例實例。
class Sluggard {//創建一個私有化的構造器private Sluggard(){System.out.println("構造方法被調用");}//創建一個私有的靜態對象private static Sluggard sluggard = new Sluggard();//創建一個公共的靜態方法public static Sluggard/*數據類型為引用類型*/ getDanLi1(){//返回對象return sluggard;} } class Main {public static void main(String[] args){//創建單例模式對象Sluggard sluggard1 = Sluggard.getDanLi1();System.out.println(sluggard1);Sluggard sluggard2 = Sluggard.getDanLi1();System.out.println(sluggard2);//無需單例模式調用類方法,無需new} }模板模式
在父類中定義一個完成該事情的總方法,按照完成事件需要的步驟去調用其每個步驟的實現方法。每個步驟的具體實現,由子類完成。
class Main {public static void main(String[] args){Specific specific = new Specific();long time = specific.masterplate();System.out.println(time+"毫秒");} } /***抽象模版*/ public abstract class AbstractTemplate {/***創建一個抽象方法*/public abstract void funtion();/***創建一個可以重寫的方法*/public void rewrite(){System.out.println("程序開始執行");}/***創建一個final修飾的方法*可以返回當前時間*/public final long currentTime(){//返回時間調用工具long time = System.currentTimeMillis();return time;}/***創建一個模版方法*/public long masterplate(){rewrite();long t1 = currentTime();funtion();long t2 = currentTime();;return t2 - t1;} } /***具體模版*/ class Specific extends AbstractTemplate {public void funtion(){for (int i = 0;i <= 100;i++){System.out.println("程序執行:" + i +"%");}} }總結
- 上一篇: Python调用茉莉机器人API接口
- 下一篇: Notepad++的使用