From a14397932ab69a4b02ba5ebb42599f15c40e2dbe Mon Sep 17 00:00:00 2001 From: lionarius Date: Wed, 15 May 2024 01:11:15 +0300 Subject: [PATCH] lab3 --- KPO_Lab.sln | 35 ++++- Lab2/src/Factory/AbstractToolFatory.cs | 20 +++ Lab2/src/Factory/IToolFactory.cs | 20 +++ Lab2/src/Factory/PrototypeFactory.cs | 55 ++++++++ Lab2/src/Factory/ScissorsAndTrimmerFactory.cs | 26 ++++ Lab2/src/Factory/ScytheAndLawnmowerFactory.cs | 26 ++++ Lab2/src/FactoryMethod/IToolFactoryMethod.cs | 14 ++ .../FactoryMethod/PrototypeFactoryMethod.cs | 36 ++++++ .../ScissorsAndTrimmerFactoryMethod.cs | 26 ++++ .../ScytheAndLawnmowerFactoryMethod.cs | 26 ++++ Lab2/src/Form/CreateLawnmower.xaml | 2 +- Lab2/src/Form/CreateLawnmower.xaml.cs | 16 ++- Lab2/src/Form/CreateScissors.xaml | 2 +- Lab2/src/Form/CreateScissors.xaml.cs | 16 ++- Lab2/src/Form/CreateScythe.xaml | 2 +- Lab2/src/Form/CreateScythe.xaml.cs | 16 ++- Lab2/src/Form/CreateTrimmer.xaml | 2 +- Lab2/src/Form/CreateTrimmer.xaml.cs | 16 ++- Lab2/src/Form/MainWindow.xaml | 17 ++- Lab2/src/Form/MainWindow.xaml.cs | 121 +++++++++--------- Lab2/src/Form/Util.cs | 34 +++++ 21 files changed, 447 insertions(+), 81 deletions(-) create mode 100644 Lab2/src/Factory/AbstractToolFatory.cs create mode 100644 Lab2/src/Factory/IToolFactory.cs create mode 100644 Lab2/src/Factory/PrototypeFactory.cs create mode 100644 Lab2/src/Factory/ScissorsAndTrimmerFactory.cs create mode 100644 Lab2/src/Factory/ScytheAndLawnmowerFactory.cs create mode 100644 Lab2/src/FactoryMethod/IToolFactoryMethod.cs create mode 100644 Lab2/src/FactoryMethod/PrototypeFactoryMethod.cs create mode 100644 Lab2/src/FactoryMethod/ScissorsAndTrimmerFactoryMethod.cs create mode 100644 Lab2/src/FactoryMethod/ScytheAndLawnmowerFactoryMethod.cs create mode 100644 Lab2/src/Form/Util.cs diff --git a/KPO_Lab.sln b/KPO_Lab.sln index a963052..3fb4f3d 100644 --- a/KPO_Lab.sln +++ b/KPO_Lab.sln @@ -5,25 +5,58 @@ VisualStudioVersion = 17.7.34202.233 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tool", "Tool\Tool.csproj", "{73C85CBC-5C3A-4F43-8B10-1462B52F709E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Lab2", "Lab2\Lab2.csproj", "{BC81743D-B4D3-4D25-A966-AD697757E98C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Lab2", "Lab2\Lab2.csproj", "{BC81743D-B4D3-4D25-A966-AD697757E98C}" ProjectSection(ProjectDependencies) = postProject + {5E9876F7-1F15-4759-8D96-D950649BBDD7} = {5E9876F7-1F15-4759-8D96-D950649BBDD7} {73C85CBC-5C3A-4F43-8B10-1462B52F709E} = {73C85CBC-5C3A-4F43-8B10-1462B52F709E} EndProjectSection EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x64.ActiveCfg = Debug|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x64.Build.0 = Debug|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x86.ActiveCfg = Debug|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Debug|x86.Build.0 = Debug|Any CPU {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|Any CPU.ActiveCfg = Release|Any CPU {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|Any CPU.Build.0 = Release|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x64.ActiveCfg = Release|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x64.Build.0 = Release|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x86.ActiveCfg = Release|Any CPU + {73C85CBC-5C3A-4F43-8B10-1462B52F709E}.Release|x86.Build.0 = Release|Any CPU {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x64.ActiveCfg = Debug|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x64.Build.0 = Debug|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x86.ActiveCfg = Debug|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Debug|x86.Build.0 = Debug|Any CPU {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|Any CPU.Build.0 = Release|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x64.ActiveCfg = Release|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x64.Build.0 = Release|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x86.ActiveCfg = Release|Any CPU + {BC81743D-B4D3-4D25-A966-AD697757E98C}.Release|x86.Build.0 = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x64.Build.0 = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Debug|x86.Build.0 = Debug|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|Any CPU.Build.0 = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x64.ActiveCfg = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x64.Build.0 = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x86.ActiveCfg = Release|Any CPU + {5E9876F7-1F15-4759-8D96-D950649BBDD7}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Lab2/src/Factory/AbstractToolFatory.cs b/Lab2/src/Factory/AbstractToolFatory.cs new file mode 100644 index 0000000..9b6a0fc --- /dev/null +++ b/Lab2/src/Factory/AbstractToolFatory.cs @@ -0,0 +1,20 @@ +namespace Patterns +{ + /// + /// Абстрактная фабрика ручных и электрических инструментов + /// + public abstract class AbstractToolFactory : IToolFactory + { + /// + /// Создание ручного инструмента + /// + /// Экземпляр ручного инструмента + public abstract ManualTool CreateManualTool(); + + /// + /// Создание электрического инструмента + /// + /// Экземпляр электрического инструмента + public abstract ElectricTool CreateElectricTool(); + } +} \ No newline at end of file diff --git a/Lab2/src/Factory/IToolFactory.cs b/Lab2/src/Factory/IToolFactory.cs new file mode 100644 index 0000000..2451903 --- /dev/null +++ b/Lab2/src/Factory/IToolFactory.cs @@ -0,0 +1,20 @@ +namespace Patterns +{ + /// + /// Интерфейс фабрики ручных и электрических инструментов + /// + public interface IToolFactory + { + /// + /// Создание ручного инструмента + /// + /// Экземпляр ручного инструмента + ManualTool CreateManualTool(); + + /// + /// Создание электрического инструмента + /// + /// Экземпляр электрического инструмента + ElectricTool CreateElectricTool(); + } +} \ No newline at end of file diff --git a/Lab2/src/Factory/PrototypeFactory.cs b/Lab2/src/Factory/PrototypeFactory.cs new file mode 100644 index 0000000..1ad3bda --- /dev/null +++ b/Lab2/src/Factory/PrototypeFactory.cs @@ -0,0 +1,55 @@ +using System; + +namespace Patterns +{ + /// + /// Фабрика прототипов ручных и электрических инструментов + /// + public class PrototypeFactory : AbstractToolFactory + { + /// + /// Прототип ручного инструмента + /// + private ManualTool _manualTool; + /// + /// Прототип электрического инструмента + /// + private ElectricTool _electricTool; + + /// + /// Конструктор + /// + /// Прототип ручного инструмента + /// Прототип электрического инструмента + /// Выбрасывается, когда один из параметров равен null + public PrototypeFactory(ManualTool parManualTool, ElectricTool parElectricTool) + { + if (parManualTool == null) + throw new ArgumentNullException(nameof(parManualTool)); + + if (parElectricTool == null) + throw new ArgumentNullException(nameof(parElectricTool)); + + _manualTool = parManualTool; + _electricTool = parElectricTool; + } + + /// + /// Создание ручного инструмента по прототипу + /// + /// Экземпляр ручного инструмента + public override ManualTool CreateManualTool() + { + return (ManualTool)_manualTool.Clone(); + } + + /// + /// Создание электрического инструмента по прототипу + /// + /// Экземпляр электрического инструмента + public override ElectricTool CreateElectricTool() + { + return (ElectricTool)_electricTool.Clone(); + } + } +} \ No newline at end of file diff --git a/Lab2/src/Factory/ScissorsAndTrimmerFactory.cs b/Lab2/src/Factory/ScissorsAndTrimmerFactory.cs new file mode 100644 index 0000000..e5616ee --- /dev/null +++ b/Lab2/src/Factory/ScissorsAndTrimmerFactory.cs @@ -0,0 +1,26 @@ +namespace Patterns +{ + /// + /// Фабрика ножниц и тримеров + /// + public class ScissorsAndTrimmerFactory : AbstractToolFactory + { + /// + /// Создание ножниц + /// + /// Экземпляр ножниц + public override ManualTool CreateManualTool() + { + return new Scissors("Si00", Material.Wood, 1, 1, 1); + } + + /// + /// Создание тримера + /// + /// Экземпляр тримера + public override ElectricTool CreateElectricTool() + { + return new Trimmer("Tr00", Material.Wood, 1, 1); + } + } +} \ No newline at end of file diff --git a/Lab2/src/Factory/ScytheAndLawnmowerFactory.cs b/Lab2/src/Factory/ScytheAndLawnmowerFactory.cs new file mode 100644 index 0000000..1098816 --- /dev/null +++ b/Lab2/src/Factory/ScytheAndLawnmowerFactory.cs @@ -0,0 +1,26 @@ +namespace Patterns +{ + /// + /// Фабрика кос и газонокосилок + /// + public class ScytheAndLawnmowerFactory : AbstractToolFactory + { + /// + /// Создание косы + /// + /// Экземпляр косы + public override ManualTool CreateManualTool() + { + return new Scythe("Sc00", Material.Wood, 1, 1, BladeType.Straight); + } + + /// + /// Создание газонокосилки + /// + /// Экземпляр газонокосилки + public override ElectricTool CreateElectricTool() + { + return new Lawnmower("La00", Material.Wood, 1, 1, 1); + } + } +} \ No newline at end of file diff --git a/Lab2/src/FactoryMethod/IToolFactoryMethod.cs b/Lab2/src/FactoryMethod/IToolFactoryMethod.cs new file mode 100644 index 0000000..713bd53 --- /dev/null +++ b/Lab2/src/FactoryMethod/IToolFactoryMethod.cs @@ -0,0 +1,14 @@ +namespace Patterns +{ + /// + /// Фабричный метод для создания фабрик + /// + public interface IToolFactoryMethod + { + /// + /// Создание фабрики + /// + /// Фабрика + IToolFactory CreateFactory(); + } +} \ No newline at end of file diff --git a/Lab2/src/FactoryMethod/PrototypeFactoryMethod.cs b/Lab2/src/FactoryMethod/PrototypeFactoryMethod.cs new file mode 100644 index 0000000..6baa1e7 --- /dev/null +++ b/Lab2/src/FactoryMethod/PrototypeFactoryMethod.cs @@ -0,0 +1,36 @@ +using Lab2; +using System; + +namespace Patterns +{ + /// + /// Фабричный метод для фабрики прототипов + /// + public class PrototypeFactoryMethod : IToolFactoryMethod + { + /// + /// Создание фабрики прототипов + /// + /// Фабрика прототипов + /// Выбрасывается, когда нельзя создать фабрику + public IToolFactory CreateFactory() + { + var scissors = new Scissors("", Material.Wood, 1, 1, 1); + var lawnmower = new Lawnmower("", Material.Wood, 1, 1, 1); + + if (Util.ShowEditForm(scissors, false, true) && Util.ShowEditForm(lawnmower, false, true)) + return new PrototypeFactory(scissors, lawnmower); + + throw new InvalidOperationException("Can't create factory"); + } + + /// + /// Получения названия создаваемой фабрики + /// + /// Название + public override string ToString() + { + return "Prototype Factory"; + } + } +} \ No newline at end of file diff --git a/Lab2/src/FactoryMethod/ScissorsAndTrimmerFactoryMethod.cs b/Lab2/src/FactoryMethod/ScissorsAndTrimmerFactoryMethod.cs new file mode 100644 index 0000000..976a82c --- /dev/null +++ b/Lab2/src/FactoryMethod/ScissorsAndTrimmerFactoryMethod.cs @@ -0,0 +1,26 @@ +namespace Patterns +{ + /// + /// Фабричный метод для фабрик ножниц и тримеров + /// + public class ScissorsAndTrimmerFactoryMethod : IToolFactoryMethod + { + /// + /// Создание фабрики ножниц и тримеров + /// + /// Фабрика ножниц и тримеров + public IToolFactory CreateFactory() + { + return new ScissorsAndTrimmerFactory(); + } + + /// + /// Получения названия создаваемой фабрики + /// + /// Название + public override string ToString() + { + return "Scissors and Trimmer Factory"; + } + } +} \ No newline at end of file diff --git a/Lab2/src/FactoryMethod/ScytheAndLawnmowerFactoryMethod.cs b/Lab2/src/FactoryMethod/ScytheAndLawnmowerFactoryMethod.cs new file mode 100644 index 0000000..d4b88b1 --- /dev/null +++ b/Lab2/src/FactoryMethod/ScytheAndLawnmowerFactoryMethod.cs @@ -0,0 +1,26 @@ +namespace Patterns +{ + /// + /// Фабричный метод для фабрик кос и газонокосилок + /// + public class ScytheAndLawnmowerFactoryMethod : IToolFactoryMethod + { + /// + /// Создание фабрики кос и газонокосилок + /// + /// Фабрика кос и газонокосилок + public IToolFactory CreateFactory() + { + return new ScytheAndLawnmowerFactory(); + } + + /// + /// Получения названия создаваемой фабрики + /// + /// Название + public override string ToString() + { + return "Scythe and Lawnmower Factory"; + } + } +} \ No newline at end of file diff --git a/Lab2/src/Form/CreateLawnmower.xaml b/Lab2/src/Form/CreateLawnmower.xaml index e9f9855..09aa5c4 100644 --- a/Lab2/src/Form/CreateLawnmower.xaml +++ b/Lab2/src/Form/CreateLawnmower.xaml @@ -37,6 +37,6 @@