《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫

本文主要是介绍《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


示例:基于抽象工厂的迷宫  
  1. 实现:  
  2.    如果TMaze.Create是传递一个对象当作参数来建立rooms、walls及doors;如此你可以以不同的参数来改变rooms、walls及doors的类。  
  3. 请注意MazeFactory也就是工厂方法(Factory Method)的一个集合;这是最通常实现抽象工厂模式的方式。同时请注意MazeFactory不是一个抽象类(abstract class)它的行为包括抽象工厂(abstractFactory)及具体工厂(ContreteFactory);这也是另一种以抽象工厂实现简单应用系统的方式。因为MazeFactory是一种具体类包含所有的工厂方法所以容易以继承及覆盖的方式建立新的MazeFactory。  
  4. 代码:  
  5.    
  6.    
  7. unit uMazeFactory;  
  8.    
  9. interface  
  10.    
  11. uses  
  12.     Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls;  
  13.    
  14. type  
  15.     {房间的四个方向}  
  16.     TDirection = (North = 0,South = 1,East = 2,West = 3);  
  17.    
  18. const  
  19.     DirectionNames: array[TDirection] of string = ('北''南''东''西');  
  20.    
  21. type  
  22.     {咒语}  
  23.     TSpell = class  
  24.     private  
  25.         FKey: string;  
  26.     public  
  27.         property Key: string read FKey write FKey;  
  28.     end;  
  29.    
  30.     {迷宫构件}  
  31.     TMapSite = class  
  32.     private  
  33.         FStateMsg: string;  
  34.     public  
  35.         function Enter: Boolean; virtual; abstract;  
  36.         //---  
  37.         property StateMsg: string read FStateMsg write FStateMsg;  
  38.     end;  
  39.     {房间}  
  40.     TRoom = class(TMapSite)  
  41.     private  
  42.         FSides: array[TDirection] of TMapSite;  
  43.         FRoomNumber: Integer;  
  44.     protected  
  45.         function GetSides(Direction: TDirection): TMapSite;  
  46.         procedure SetSides(Direction: TDirection; const Value: TMapSite);  
  47.     public  
  48.         constructor Create(ARoomNumber: integer);  
  49.         destructor Destroy; override;  
  50.         //---  
  51.         function Enter: Boolean; override;  
  52.         //---  
  53.         property RoomNumber: Integer read FRoomNumber;  
  54.         property Sides[Direction: TDirection]: TMapSite read GetSides write SetSides;  
  55.     end;  
  56.     TRoomWithABomb = class(TRoom)  
  57.     private  
  58.         FBomb: boolean;  
  59.     public  
  60.         constructor Create(ARoomNumber: integer; Bombed: boolean = false);  
  61.         //---  
  62.         procedure Initialize1(Bombed: boolean);  
  63.         function HasBomb(): Boolean;  
  64.         function Enter: Boolean; override;  
  65.     end;  
  66.     TEnchantedRoom = class(TRoom)  
  67.     private  
  68.         FSpell: TSpell;  
  69.     public  
  70.         constructor Create(ARoomNumber: integer; Spell: TSpell = nil);  
  71.         destructor Destroy; override;  
  72.         //---  
  73.         function Enter: Boolean; override;  
  74.         //---  
  75.         function HasSpell(): boolean;  
  76.         function PickUpSpell(): TSpell;  
  77.     end;  
  78.     {墙壁}  
  79.     TWall = class(TMapSite)  
  80.     public  
  81.         function Enter: Boolean; override;  
  82.     end;  
  83.     TBombedWall = class(TWall)  
  84.     private  
  85.         FBomb: boolean;  
  86.     public  
  87.         constructor Create(Bombed: boolean = false);  
  88.         //---  
  89.         function Enter: Boolean; override;  
  90.         procedure Initialize1(Bombed: boolean);  
  91.     end;  
  92.     {门}  
  93.     TDoor = class(TMapSite)  
  94.     private  
  95.         FRoom1,FRoom2: TRoom;  
  96.         //--门是否开启  
  97.         FIsOpen: Boolean;  
  98.         procedure Initialize(room1,room2: TRoom);  
  99.     public  
  100.         constructor Create(room1,room2: TRoom); virtual;  
  101.         destructor Destroy; override;  
  102.         //---  
  103.         function Enter: Boolean; override;  
  104.         {从一个房间(传入参数)进入另一个房间(输出结果)}  
  105.         function OtherSideFrom(Room: TRoom): TRoom;  
  106.     end;  
  107.     TDoorNeedingSpell = class(TDoor)  
  108.     private  
  109.         FSpell: TSpell;  
  110.         function TrySpell(Spell: TSpell): boolean;  
  111.     public  
  112.         constructor Create(room1,room2: TRoom); override;  
  113.         destructor Destroy; override;  
  114.         //---  
  115.         function Enter: Boolean; override;  
  116.     end;  
  117.     TRoomList = class  
  118.     private  
  119.         FItemList: TList;  
  120.         function GetCount: Integer;  
  121.         function GetItems(Index: integer): TRoom;  
  122.     protected  
  123.         procedure Clear;  
  124.     public  
  125.         constructor Create;  
  126.         destructor Destroy; override;  
  127.         //---  
  128.         function Add(const Room: TRoom): integer;  
  129.         //---  
  130.         property Count: Integer read GetCount;  
  131.         property Items[Index: integer]: TRoom read GetItems;  
  132.     end;  
  133.    
  134.     {迷宫}  
  135.     TMaze = class  
  136.     private  
  137.         FRooms: TRoomList;  
  138.     public  
  139.         constructor Create;  
  140.         destructor Destroy; override;  
  141.         //---  
  142.         {在迷宫中加入一个房间}  
  143.         procedure AddRoom(Room: TRoom);  
  144.         {根据房间编号取得房间}  
  145.         function RoomNo(RoomNumber: Integer): TRoom;  
  146.     end;  
  147.     {迷宫构件工厂}  
  148.     TMazeFactory = class  
  149.     protected  
  150.         function MakeDoor(r1,r2: TRoom): TDoor; virtual;  
  151.         function MakeMaze: TMaze; virtual;  
  152.         function MakeRoom(ARoomNumber: integer): TRoom; virtual;  
  153.         function MakeWall: TWall; virtual;  
  154.     end;  
  155.     {炸弹迷宫构件工厂}  
  156.     TBombedMazeFactory = class(TMazeFactory)  
  157.     protected  
  158.         function MakeRoom(ARoomNumber: integer): TRoom; override;  
  159.         function MakeWall(): TWall; override;  
  160.     end;  
  161.     {魔法迷宫构件工厂}  
  162.     TEnchantedMazeFactory = class(TMazeFactory)  
  163.     private  
  164.         function CastSpell(): TSpell;  
  165.     protected  
  166.         function MakeRoom(ARoomNumber: integer): TRoom; override;  
  167.         function MakeDoor(r1,r2: TRoom): TDoor; override;  
  168.     end;  
  169.    
  170.     {迷宫游戏}  
  171.     TMazeGame = class  
  172.     public  
  173.         function CreateMaze(factory: TMazeFactory): TMaze;  
  174.     end;  
  175.    
  176. var  
  177.     CurSpell: TSpell;  
  178.    
  179. implementation  
  180.    
  181. constructor TRoom.Create(ARoomNumber: integer);  
  182.     //---  
  183.     procedure _InitSides;  
  184.     var  
  185.         Direction: TDirection;  
  186.     begin  
  187.         for Direction := Low(FSides) to High(FSides) do  
  188.             FSides[Direction] := nil;  
  189.     end;  
  190. begin  
  191.     inherited Create;  
  192.     //---  
  193.     FRoomNumber := ARoomNumber;  
  194.     //---  
  195.     _InitSides;  
  196. end;  
  197.    
  198. destructor TRoom.Destroy;  
  199.     //---  
  200.     procedure _ClearSides;  
  201.     var  
  202.         Direction: TDirection;  
  203.     begin  
  204.         for Direction := Low(FSides) to High(FSides) do  
  205.         begin  
  206.             if FSides[Direction] <> nil then  
  207.                 FSides[Direction].Free;  
  208.         end;  
  209.     end;  
  210. begin  
  211.     _ClearSides;  
  212.     //---  
  213.     inherited;  
  214. end;  
  215.    
  216. function TRoom.Enter: Boolean;  
  217. begin  
  218.     self.StateMsg := format('进入房间%d', [FRoomNumber]);  
  219.     Result := true;  
  220. end;  
  221.    
  222. function TRoom.GetSides(Direction: TDirection): TMapSite;  
  223. begin  
  224.     Result := FSides[Direction];  
  225. end;  
  226.    
  227. procedure TRoom.SetSides(Direction: TDirection; const Value: TMapSite);  
  228. begin  
  229.     FSides[Direction] := Value;  
  230. end;  
  231.    
  232. function TWall.Enter: Boolean;  
  233. begin  
  234.     self.StateMsg := '碰到墙';  
  235.     Result := false;  
  236. end;  
  237.    
  238. constructor TDoor.Create;  
  239. begin  
  240.     inherited Create;  
  241.     //---  
  242.     Initialize(room1,room2);  
  243. end;  
  244.    
  245. destructor TDoor.Destroy;  
  246.     //---  
  247.     procedure _ClearDoor(Room: TRoom);  
  248.     var  
  249.         Direction: TDirection;  
  250.     begin  
  251.         if Room <> nil then  
  252.         begin  
  253.             with Room do  
  254.             begin  
  255.                 for Direction := Low(TDirection) to High(TDirection) do  
  256.                 begin  
  257.                     if Sides[Direction] = self then  
  258.                     begin  
  259.                         Sides[Direction] := nil;  
  260.                         exit;  
  261.                     end;  
  262.                 end;  
  263.             end;  
  264.         end;  
  265.     end;  
  266. begin  
  267.     _ClearDoor(FRoom1);  
  268.     _ClearDoor(FRoom2);  
  269.     //---  
  270.     inherited;  
  271. end;  
  272.    
  273. function TDoor.Enter: Boolean;  
  274. begin  
  275.     self.StateMsg := '碰到门';  
  276.     Result := true;  
  277. end;  
  278.    
  279. procedure TDoor.Initialize(room1,room2: TRoom);  
  280. begin  
  281.     FRoom1 := room1;  
  282.     FRoom2 := room2;  
  283.     FIsOpen := False;  
  284. end;  
  285.    
  286. function TDoor.OtherSideFrom(Room: TRoom): Troom;  
  287. begin  
  288.     if Room = FRoom1 then  
  289.         Result := FRoom2  
  290.     else  
  291.         Result := FRoom1;  
  292. end;  
  293.    
  294. constructor TBombedWall.Create(Bombed: boolean);  
  295. begin  
  296.     inherited Create;  
  297.     //---  
  298.     Initialize1(Bombed);  
  299. end;  
  300.    
  301. function TBombedWall.Enter: Boolean;  
  302. begin  
  303.     if FBomb then  
  304.     begin  
  305.         self.StateMsg := '碰到炸弹墙';  
  306.         Result := false;  
  307.     end  
  308.     else  
  309.         Result := inherited Enter;  
  310. end;  
  311.    
  312. procedure TBombedWall.Initialize1(Bombed: boolean);  
  313. begin  
  314.     FBomb := Bombed;  
  315. end;  
  316.    
  317. constructor TDoorNeedingSpell.Create(room1,room2: TRoom);  
  318. begin  
  319.     inherited;  
  320.     //---  
  321.     FSpell := TSpell.Create;  
  322.     FSpell.Key := '123';  
  323. end;  
  324.    
  325. destructor TDoorNeedingSpell.Destroy;  
  326. begin  
  327.     FSpell.Free;  
  328.     //---  
  329.     inherited;  
  330. end;  
  331.    
  332. function TDoorNeedingSpell.Enter: Boolean;  
  333. begin  
  334.     Result := TrySpell(CurSpell);  
  335.     if Result then  
  336.         self.StateMsg := '碰到门,使用了正确的咒语卷轴'  
  337.     else  
  338.         self.StateMsg := '碰到门,使用了错误的咒语卷轴';  
  339. end;  
  340.    
  341. function TDoorNeedingSpell.TrySpell(Spell: TSpell): boolean;  
  342. begin  
  343.     Result := FSpell.Key = Spell.Key;  
  344. end;  
  345.    
  346. constructor TRoomWithABomb.Create(ARoomNumber: integer; Bombed: boolean);  
  347. begin  
  348.     inherited Create(ARoomNumber);  
  349.     //---  
  350.     Initialize1(Bombed);  
  351. end;  
  352.    
  353. function TRoomWithABomb.Enter: Boolean;  
  354. begin  
  355.     if HasBomb then  
  356.     begin  
  357.         self.StateMsg := format('进入有炸弹的房间%d', [FRoomNumber]);  
  358.         Result := true;  
  359.     end  
  360.     else  
  361.         Result := inherited Enter;  
  362. end;  
  363.    
  364. function TRoomWithABomb.HasBomb: Boolean;  
  365. begin  
  366.     Result := FBomb;  
  367. end;  
  368.    
  369. procedure TRoomWithABomb.Initialize1(Bombed: boolean);  
  370. begin  
  371.     FBomb := Bombed;  
  372. end;  
  373.    
  374. constructor TEnchantedRoom.Create(ARoomNumber: integer; Spell: TSpell);  
  375. begin  
  376.     inherited Create(ARoomNumber);  
  377.     //---  
  378.     FSpell := Spell;  
  379. end;  
  380.    
  381. destructor TEnchantedRoom.Destroy;  
  382. begin  
  383.     if FSpell <> nil then  
  384.         FSpell.Free;  
  385.     //---  
  386.     inherited;  
  387. end;  
  388.    
  389. function TEnchantedRoom.Enter: Boolean;  
  390. begin  
  391.     if HasSpell then  
  392.     begin  
  393.         CurSpell := PickUpSpell;  
  394.         self.StateMsg := format('进入房间%d,拿起咒语卷轴', [FRoomNumber]);  
  395.         Result := true;  
  396.     end  
  397.     else  
  398.         Result := inherited Enter;  
  399. end;  
  400.    
  401. function TEnchantedRoom.HasSpell: boolean;  
  402. begin  
  403.     Result := FSpell <> nil;  
  404. end;  
  405.    
  406. function TEnchantedRoom.PickUpSpell: TSpell;  
  407. begin  
  408.     Result := FSpell;  
  409. end;  
  410.    
  411. constructor TMaze.Create;  
  412. begin  
  413.     inherited;  
  414.     //---  
  415.     FRooms := TRoomList.Create;  
  416. end;  
  417.    
  418. destructor TMaze.Destroy;  
  419. begin  
  420.     FRooms.Free;  
  421.     //---  
  422.     inherited;  
  423. end;  
  424.    
  425. procedure TMaze.AddRoom(Room: TRoom);  
  426. begin  
  427.     FRooms.Add(Room);  
  428. end;  
  429.    
  430. function TMaze.RoomNo(RoomNumber: Integer): TRoom;  
  431. var  
  432.     i: Integer;  
  433. begin  
  434.     Result := nil;  
  435.     //---  
  436.     with FRooms do  
  437.     begin  
  438.         for i := 0 to Count - 1 do  
  439.         begin  
  440.             if Items[i].Roomnumber = RoomNumber then  
  441.             begin  
  442.                 Result := Items[i];  
  443.                 Exit;  
  444.             end;  
  445.         end;  
  446.     end;  
  447. end;  
  448.    
  449. function TMazeFactory.MakeDoor(r1,r2: TRoom): TDoor;  
  450. begin  
  451.     Result := TDoor.Create(r1,r2);  
  452. end;  
  453.    
  454. function TMazeFactory.MakeMaze: TMaze;  
  455. begin  
  456.     Result := TMaze.Create;  
  457. end;  
  458.    
  459. function TMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  460. begin  
  461.     Result := TRoom.Create(ARoomNumber);  
  462. end;  
  463.    
  464. function TMazeFactory.MakeWall: TWall;  
  465. begin  
  466.     Result := TWall.Create;  
  467. end;  
  468.    
  469. function TBombedMazeFactory.MakeWall(): TWall;  
  470. begin  
  471.     Result := TBombedWall.Create;  
  472. end;  
  473.    
  474. function TBombedMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  475. begin  
  476.     Result := TRoomWithABomb.Create(ARoomNumber);  
  477. end;  
  478.    
  479. function TEnchantedMazeFactory.MakeRoom(ARoomNumber: integer): TRoom;  
  480. begin  
  481.     Result := TEnchantedRoom.Create(ARoomNumber,CastSpell);  
  482. end;  
  483.    
  484. function TEnchantedMazeFactory.CastSpell(): TSpell;  
  485. begin  
  486.     Result := TSpell.Create;  
  487.     Result.Key := '123';  
  488. end;  
  489.    
  490. function TEnchantedMazeFactory.MakeDoor(r1,r2: TRoom): TDoor;  
  491. begin  
  492.     Result := TDoorNeedingSpell.Create(r1,r2);  
  493. end;  
  494.    
  495. function TMazeGame.CreateMaze(factory: TMazeFactory): TMaze;  
  496. var  
  497.     aMaze: TMaze;  
  498.     r1,r2: Troom;  
  499.     theDoor: TDoor;  
  500. begin  
  501.     //---建构一个maze,有两个Room,一个Door,六面Wall  
  502.     aMaze := factory.MakeMaze;  
  503.     //---  
  504.     r1 := factory.MakeRoom(1);  
  505.     r2 := factory.MakeRoom(2);  
  506.     //---  
  507.     theDoor := factory.MakeDoor(r1,r2);  
  508.     //---  
  509.     aMaze.AddRoom(r1);  
  510.     aMaze.AddRoom(r2);  
  511.     //---  
  512.     r1.SetSides(North,factory.MakeWall());  
  513.     r1.SetSides(East,theDoor);  
  514.     r1.SetSides(South,factory.MakeWall());  
  515.     r1.SetSides(West,factory.MakeWall());  
  516.     //---  
  517.     r2.SetSides(North,factory.MakeWall());  
  518.     r2.SetSides(East,factory.MakeWall());  
  519.     r2.SetSides(South,factory.MakeWall());  
  520.     r2.SetSides(West,theDoor);  
  521.     //---  
  522.     result := aMaze;  
  523. end;  
  524.    
  525. constructor TRoomList.Create;  
  526. begin  
  527.     inherited;  
  528.     //---  
  529.     FItemList := TList.Create;  
  530. end;  
  531.    
  532. destructor TRoomList.Destroy;  
  533. begin  
  534.     Clear;  
  535.     FItemList.Free;  
  536.     //---  
  537.     inherited;  
  538. end;  
  539.    
  540. function TRoomList.Add(const Room: TRoom): integer;  
  541. begin  
  542.     if Assigned(Room) then  
  543.         Result := FItemList.Add(Room)  
  544.     else  
  545.         Result := -1;  
  546. end;  
  547.    
  548. procedure TRoomList.Clear;  
  549. var  
  550.     i: Integer;  
  551. begin  
  552.     with FItemList do  
  553.     begin  
  554.         for i := 0 to Count - 1 do  
  555.             TObject(Items[i]).Free;  
  556.         //---  
  557.         Clear;  
  558.     end;  
  559. end;  
  560.    
  561. function TRoomList.GetCount: Integer;  
  562. begin  
  563.     Result := FItemList.Count;  
  564. end;  
  565.    
  566. function TRoomList.GetItems(Index: integer): TRoom;  
  567. begin  
  568.     Result := FItemList[Index];  
  569. end;  
  570.    
  571.    
  572. end.  
  573.    
  574. unit Unit2;  
  575.    
  576. interface  
  577.    
  578. uses  
  579.     Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,  
  580.     Dialogs,StdCtrls,uMazeFactory;  
  581.    
  582. type  
  583.     TForm2 = class(TForm)  
  584.         ListBox1: TListBox;  
  585.         procedure FormDestroy(Sender: TObject);  
  586.         procedure FormCreate(Sender: TObject);  
  587.         procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  
  588.         procedure ListBox1KeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);  
  589.     private  
  590.         FMazeGame: TMazeGame;  
  591.         FMazeFactory: TMazeFactory;  
  592.         FMaze: TMaze;  
  593.         FCurRoom: TRoom;  
  594.     public  
  595.     { Public declarations }  
  596.     end;  
  597.    
  598. var  
  599.     Form2: TForm2;  
  600.    
  601. implementation  
  602.    
  603. {$R *.dfm}  
  604.    
  605. procedure TForm2.FormCreate(Sender: TObject);  
  606. begin  
  607.     self.KeyPreview := true;  
  608.     //---  
  609.     FMazeGame := TMazeGame.Create;  
  610.     //---  
  611.     {FMazeFactory := TMazeFactory.Create; 
  612.     FMaze := FMazeGame.CreateMaze(FMazeFactory); }  
  613.     //---  
  614.     FMazeFactory := TBombedMazeFactory.Create;  
  615.     FMaze := FMazeGame.CreateMaze(FMazeFactory);  
  616.     TRoomWithABomb(FMaze.RoomNo(2)).Initialize1(true);  
  617.     //---  
  618.     {FMazeFactory := TEnchantedMazeFactory.Create; 
  619.     FMaze := FMazeGame.CreateMaze(FMazeFactory);}  
  620.     //---  
  621.     FCurRoom := FMaze.RoomNo(1);  
  622.     with FCurRoom do  
  623.     begin  
  624.         Enter;  
  625.         ListBox1.Items.Add(StateMsg);  
  626.     end;  
  627. end;  
  628.    
  629. procedure TForm2.FormDestroy(Sender: TObject);  
  630. begin  
  631.     FMaze.Free;  
  632.     FMazeFactory.Free;  
  633.     FMazeGame.Free;  
  634. end;  
  635.    
  636. procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift:  
  637.     TShiftState);  
  638.     //---  
  639.     procedure _EnterRoomSide(Direction: TDirection);  
  640.     var  
  641.         ARoom: TRoom;  
  642.     begin  
  643.         with FCurRoom do  
  644.         begin  
  645.             if Sides[Direction] <> nil then  
  646.             begin  
  647.                 with Sides[Direction] do  
  648.                 begin  
  649.                     if Enter then  
  650.                     begin  
  651.                         ListBox1.Items.Add(DirectionNames[Direction] + ':' + StateMsg);  
  652.                         //---  
  653.                         if Sides[Direction] is TDoor then  
  654.                         begin  
  655.                             ARoom := TDoor(Sides[Direction]).OtherSideFrom(FCurRoom);  
  656.                             if ARoom <> nil then  
  657.                             begin  
  658.                                 if ARoom.Enter then  
  659.                                     FCurRoom := ARoom;  
  660.                                 ListBox1.Items.Add(ARoom.StateMsg);  
  661.                             end;  
  662.                         end;  
  663.                     end  
  664.                     else  
  665.                         ListBox1.Items.Add(DirectionNames[Direction] + ':' + StateMsg);  
  666.                 end;  
  667.             end;  
  668.         end;  
  669.     end;  
  670. begin  
  671.     case Ord(Key) of  
  672.         VK_LEFT: _EnterRoomSide(East);  
  673.         VK_RIGHT: _EnterRoomSide(West);  
  674.         VK_UP: _EnterRoomSide(South);  
  675.         VK_DOWN: _EnterRoomSide(North);  
  676.     end;  
  677. end;  
  678.    
  679. procedure TForm2.ListBox1KeyDown(Sender: TObject; var Key: Word; Shift:  
  680.     TShiftState);  
  681. begin  
  682.     Key := 0;  
  683. end;  
  684.    
  685. end.  

这篇关于《GOF设计模式》—抽象工厂(Abstract Factory)—Delphi源码示例:基于抽象工厂的迷宫的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1142328

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Java ArrayList扩容机制 (源码解读)

结论:初始长度为10,若所需长度小于1.5倍原长度,则按照1.5倍扩容。若不够用则按照所需长度扩容。 一. 明确类内部重要变量含义         1:数组默认长度         2:这是一个共享的空数组实例,用于明确创建长度为0时的ArrayList ,比如通过 new ArrayList<>(0),ArrayList 内部的数组 elementData 会指向这个 EMPTY_EL

如何在Visual Studio中调试.NET源码

今天偶然在看别人代码时,发现在他的代码里使用了Any判断List<T>是否为空。 我一般的做法是先判断是否为null,再判断Count。 看了一下Count的源码如下: 1 [__DynamicallyInvokable]2 public int Count3 {4 [__DynamicallyInvokable]5 get

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

kubelet组件的启动流程源码分析

概述 摘要: 本文将总结kubelet的作用以及原理,在有一定基础认识的前提下,通过阅读kubelet源码,对kubelet组件的启动流程进行分析。 正文 kubelet的作用 这里对kubelet的作用做一个简单总结。 节点管理 节点的注册 节点状态更新 容器管理(pod生命周期管理) 监听apiserver的容器事件 容器的创建、删除(CRI) 容器的网络的创建与删除

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于