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 @@
-
+
diff --git a/Lab2/src/Form/CreateLawnmower.xaml.cs b/Lab2/src/Form/CreateLawnmower.xaml.cs
index bff3d6d..2635986 100644
--- a/Lab2/src/Form/CreateLawnmower.xaml.cs
+++ b/Lab2/src/Form/CreateLawnmower.xaml.cs
@@ -20,6 +20,10 @@ namespace Lab2
///
private readonly bool _readOnly;
///
+ /// Признак невозможности отмены
+ ///
+ private readonly bool _isForced;
+ ///
/// Газонокосилка для редактирования
///
private readonly Lawnmower _lawnmower;
@@ -29,8 +33,9 @@ namespace Lab2
///
/// Газонокосилка для редактирования
/// Доступность полей формы
+ /// Признак невозможности отмены
/// Выбрасывается, когда газонокосилка равна null
- public CreateLawnmower(Lawnmower parLawnmower, bool parReadOnly = false)
+ public CreateLawnmower(Lawnmower parLawnmower, bool parReadOnly = false, bool parIsForced = false)
{
if (parLawnmower == null)
throw new ArgumentNullException(nameof(parLawnmower));
@@ -41,6 +46,7 @@ namespace Lab2
_lawnmower = parLawnmower;
_readOnly = parReadOnly;
+ _isForced = parIsForced;
DataContext = _lawnmower;
Title = $"Lawnmower {_lawnmower.Id}";
@@ -49,6 +55,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
+
+ if (_isForced)
+ _cancelButton.Visibility = Visibility.Collapsed;
}
///
@@ -92,7 +101,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
+ {
+ if (_isForced)
+ e.Cancel = true;
+
return;
+ }
try
{
diff --git a/Lab2/src/Form/CreateScissors.xaml b/Lab2/src/Form/CreateScissors.xaml
index a79ad81..6eb1bfb 100644
--- a/Lab2/src/Form/CreateScissors.xaml
+++ b/Lab2/src/Form/CreateScissors.xaml
@@ -37,6 +37,6 @@
-
+
diff --git a/Lab2/src/Form/CreateScissors.xaml.cs b/Lab2/src/Form/CreateScissors.xaml.cs
index a3bb9b6..83a2042 100644
--- a/Lab2/src/Form/CreateScissors.xaml.cs
+++ b/Lab2/src/Form/CreateScissors.xaml.cs
@@ -20,6 +20,10 @@ namespace Lab2
///
private readonly bool _readOnly;
///
+ /// Признак невозможности отмены
+ ///
+ private readonly bool _isForced;
+ ///
/// Ножницы для редактирования
///
private readonly Scissors _scissors;
@@ -29,8 +33,9 @@ namespace Lab2
///
/// Ножницы для редактирования
/// Доступность полей формы
+ /// Признак невозможности отмены
/// Выбрасывается, когда ножницы равны null
- public CreateScissors(Scissors parScissors, bool parReadOnly = false)
+ public CreateScissors(Scissors parScissors, bool parReadOnly = false, bool parIsForced = false)
{
if (parScissors == null)
throw new ArgumentNullException(nameof(parScissors));
@@ -41,6 +46,7 @@ namespace Lab2
_scissors = parScissors;
_readOnly = parReadOnly;
+ _isForced = parIsForced;
DataContext = _scissors;
Title = $"Scissors {_scissors.Id}";
@@ -49,6 +55,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
+
+ if (_isForced)
+ _cancelButton.Visibility = Visibility.Collapsed;
}
///
@@ -92,7 +101,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
+ {
+ if (_isForced)
+ e.Cancel = true;
+
return;
+ }
try
{
diff --git a/Lab2/src/Form/CreateScythe.xaml b/Lab2/src/Form/CreateScythe.xaml
index 2e096a3..af0bad9 100644
--- a/Lab2/src/Form/CreateScythe.xaml
+++ b/Lab2/src/Form/CreateScythe.xaml
@@ -37,6 +37,6 @@
-
+
diff --git a/Lab2/src/Form/CreateScythe.xaml.cs b/Lab2/src/Form/CreateScythe.xaml.cs
index 9aa4ac0..e951e80 100644
--- a/Lab2/src/Form/CreateScythe.xaml.cs
+++ b/Lab2/src/Form/CreateScythe.xaml.cs
@@ -20,6 +20,10 @@ namespace Lab2
///
private readonly bool _readOnly;
///
+ /// Признак невозможности отмены
+ ///
+ private readonly bool _isForced;
+ ///
/// Коса для редактирования
///
private readonly Scythe _scythe;
@@ -29,8 +33,9 @@ namespace Lab2
///
/// Коса для редактирования
/// Доступность полей формы
+ /// Признак невозможности отмены
/// Выбрасывается, когда коса равна null
- public CreateScythe(Scythe parScythe, bool parReadOnly = false)
+ public CreateScythe(Scythe parScythe, bool parReadOnly = false, bool parIsForced = false)
{
if (parScythe == null)
throw new ArgumentNullException(nameof(parScythe));
@@ -42,6 +47,7 @@ namespace Lab2
_scythe = parScythe;
_readOnly = parReadOnly;
+ _isForced = parIsForced;
DataContext = _scythe;
Title = $"Scythe {_scythe.Id}";
@@ -50,6 +56,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
+
+ if (_isForced)
+ _cancelButton.Visibility = Visibility.Collapsed;
}
///
@@ -93,7 +102,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
+ {
+ if (_isForced)
+ e.Cancel = true;
+
return;
+ }
try
{
diff --git a/Lab2/src/Form/CreateTrimmer.xaml b/Lab2/src/Form/CreateTrimmer.xaml
index 6bc50bb..483c8b9 100644
--- a/Lab2/src/Form/CreateTrimmer.xaml
+++ b/Lab2/src/Form/CreateTrimmer.xaml
@@ -37,6 +37,6 @@
-
+
diff --git a/Lab2/src/Form/CreateTrimmer.xaml.cs b/Lab2/src/Form/CreateTrimmer.xaml.cs
index d365d16..3e45ec1 100644
--- a/Lab2/src/Form/CreateTrimmer.xaml.cs
+++ b/Lab2/src/Form/CreateTrimmer.xaml.cs
@@ -20,6 +20,10 @@ namespace Lab2
///
private readonly bool _readOnly;
///
+ /// Признак невозможности отмены
+ ///
+ private readonly bool _isForced;
+ ///
/// Триммер для редактирования
///
private readonly Trimmer _trimmer;
@@ -29,8 +33,9 @@ namespace Lab2
///
/// Триммер для редактирования
/// Доступность полей формы
+ /// Признак невозможности отмены
/// Выбрасывается, когда триммер равен null
- public CreateTrimmer(Trimmer parTrimmer, bool parReadOnly = false)
+ public CreateTrimmer(Trimmer parTrimmer, bool parReadOnly = false, bool parIsForced = false)
{
if (parTrimmer == null)
throw new ArgumentNullException(nameof(parTrimmer));
@@ -42,6 +47,7 @@ namespace Lab2
_trimmer = parTrimmer;
_readOnly = parReadOnly;
+ _isForced = parIsForced;
DataContext = _trimmer;
Title = $"Trimmer {_trimmer.Id}";
@@ -50,6 +56,9 @@ namespace Lab2
if (_readOnly)
_saveButton.Content = "Ok";
+
+ if (_isForced)
+ _cancelButton.Visibility = Visibility.Collapsed;
}
///
@@ -93,7 +102,12 @@ namespace Lab2
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (!_save)
+ {
+ if (_isForced)
+ e.Cancel = true;
+
return;
+ }
try
{
diff --git a/Lab2/src/Form/MainWindow.xaml b/Lab2/src/Form/MainWindow.xaml
index af29502..1a47af6 100644
--- a/Lab2/src/Form/MainWindow.xaml
+++ b/Lab2/src/Form/MainWindow.xaml
@@ -17,20 +17,19 @@
-
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/Lab2/src/Form/MainWindow.xaml.cs b/Lab2/src/Form/MainWindow.xaml.cs
index 92b625f..a512cd0 100644
--- a/Lab2/src/Form/MainWindow.xaml.cs
+++ b/Lab2/src/Form/MainWindow.xaml.cs
@@ -1,6 +1,9 @@
using System;
using System.Windows;
using System.Collections.ObjectModel;
+using Patterns;
+using System.Collections.Generic;
+using System.Linq;
namespace Lab2
{
@@ -19,6 +22,44 @@ namespace Lab2
///
private Random _random = new();
+ ///
+ /// Список фабрик
+ ///
+ private List _factoryMethods = new()
+ {
+ new ScissorsAndTrimmerFactoryMethod(),
+ new ScytheAndLawnmowerFactoryMethod(),
+ new PrototypeFactoryMethod(),
+ };
+
+ ///
+ /// Текущая фабрика
+ ///
+ private IToolFactory _currentFactory;
+
+ ///
+ /// Выбранный фабричный метод
+ ///
+ private IToolFactoryMethod _selectedMethod;
+
+ ///
+ /// Список фабрик
+ ///
+ public ICollection FactoryMethods => _factoryMethods;
+
+ ///
+ /// Выбранный фабричный метод
+ ///
+ public IToolFactoryMethod SelectedMethod
+ {
+ get => _selectedMethod;
+ set
+ {
+ _selectedMethod = value;
+ _currentFactory = value.CreateFactory();
+ }
+ }
+
///
/// Конструктор
///
@@ -26,6 +67,9 @@ namespace Lab2
{
InitializeComponent();
+ SelectedMethod = _factoryMethods.First();
+
+ DataContext = this;
_dataGrid.ItemsSource = _tools;
}
@@ -51,33 +95,6 @@ namespace Lab2
return _tools[_dataGrid.SelectedIndex];
}
- ///
- /// Открывает форму редактирования
- ///
- /// Инструмент
- /// True, если редактирование прошло успешно, иначе - false
- private bool ShowEditForm(Tool parTool, bool parReadOnly = false)
- {
- Window? form = parTool switch
- {
- Scissors scissors => new CreateScissors(scissors, parReadOnly),
- Scythe scythe => new CreateScythe(scythe, parReadOnly),
- Trimmer trimmer => new CreateTrimmer(trimmer, parReadOnly),
- Lawnmower lawnmower => new CreateLawnmower(lawnmower, parReadOnly),
- _ => null,
- };
-
- if (form == null)
- return false;
-
- var result = form.ShowDialog();
-
- _dataGrid.Items.Refresh();
-
- return result ?? false;
- }
-
-
///
/// Генерирует случайный триммер
///
@@ -115,47 +132,23 @@ namespace Lab2
}
///
- /// Обработчик события нажатия на кнопку "Add Scissors"
+ /// Обработчик события нажатия на кнопку "Add Manual Tool"
///
- private void CreateScissorsButton_Click(object sender, RoutedEventArgs e)
+ private void CreateManualToolButton_Click(object sender, RoutedEventArgs e)
{
- var scissors = new Scissors("", Material.Wood, 1, 1, 1);
-
- if (ShowEditForm(scissors))
- _tools.Add(scissors);
+ var tool = _currentFactory.CreateManualTool();
+ if (Util.ShowEditForm(tool))
+ _tools.Add(tool);
}
///
- /// Обработчик события нажатия на кнопку "Add Scythe"
+ /// Обработчик события нажатия на кнопку "Add Electric Tool"
///
- private void CreateScytheButton_Click(object sender, RoutedEventArgs e)
+ private void CreateElectricToolButton_Click(object sender, RoutedEventArgs e)
{
- var scythe = new Scythe("", Material.Wood, 1, 1, BladeType.Straight);
-
- if (ShowEditForm(scythe))
- _tools.Add(scythe);
- }
-
- ///
- /// Обработчик события нажатия на кнопку "Add Trimmer"
- ///
- private void CreateTrimmerButton_Click(object sender, RoutedEventArgs e)
- {
- var trimmer = new Trimmer("", Material.Wood, 1, 1);
-
- if (ShowEditForm(trimmer))
- _tools.Add(trimmer);
- }
-
- ///
- /// Обработчик события нажатия на кнопку "Add Lawnmower"
- ///
- private void CreateLawnmowerButton_Click(object sender, RoutedEventArgs e)
- {
- var lawnmower = new Lawnmower("", Material.Wood, 1, 1, 1);
-
- if (ShowEditForm(lawnmower))
- _tools.Add(lawnmower);
+ var tool = _currentFactory.CreateElectricTool();
+ if (Util.ShowEditForm(tool))
+ _tools.Add(tool);
}
///
@@ -167,7 +160,9 @@ namespace Lab2
if (item == null)
return;
- ShowEditForm(item);
+ Util.ShowEditForm(item);
+
+ _dataGrid.Items.Refresh();
}
///
@@ -179,7 +174,7 @@ namespace Lab2
if (selected == null)
return;
- if (!ShowEditForm(selected, true))
+ if (!Util.ShowEditForm(selected, true))
return;
_tools.Remove(selected);
diff --git a/Lab2/src/Form/Util.cs b/Lab2/src/Form/Util.cs
new file mode 100644
index 0000000..d479f5e
--- /dev/null
+++ b/Lab2/src/Form/Util.cs
@@ -0,0 +1,34 @@
+using System.Windows;
+
+namespace Lab2
+{
+ ///
+ /// Класс для утилит форм
+ ///
+ public static class Util
+ {
+ ///
+ /// Открывает форму редактирования
+ ///
+ /// Инструмент
+ /// True, если редактирование прошло успешно, иначе - false
+ public static bool ShowEditForm(Tool parTool, bool parReadOnly = false, bool parIsForced = false)
+ {
+ Window? form = parTool switch
+ {
+ Scissors scissors => new CreateScissors(scissors, parReadOnly, parIsForced),
+ Scythe scythe => new CreateScythe(scythe, parReadOnly, parIsForced),
+ Trimmer trimmer => new CreateTrimmer(trimmer, parReadOnly, parIsForced),
+ Lawnmower lawnmower => new CreateLawnmower(lawnmower, parReadOnly, parIsForced),
+ _ => null,
+ };
+
+ if (form == null)
+ return false;
+
+ var result = form.ShowDialog();
+
+ return result ?? false;
+ }
+ }
+}
\ No newline at end of file