
2 / пр2
.pdfМИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ федеральное государственное автономное образовательное учреждение высшего образования
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ»
ИНСТИТУТ НЕПРЕРЫВНОГО И ДИСТАНЦИОННОГО ОБРАЗОВАНИЯ
КАФЕДРА №41
ОЦЕНКА
ПРЕПОДАВАТЕЛЬ
Доцент, к. т. н. |
|
|
|
С. А. Чернышев |
|
|
|
|
|
должность, уч. степень, |
|
подпись, дата |
|
инициалы, фамилия |
звание |
|
|
||
|
|
|
|
Практическая работа №2
На тему: Порождающие шаблоны GoF
по дисциплине: Технологии программирования
РАБОТУ ВЫПОЛНИЛА |
|
|
|
|
|
СТУДЕНТКА ГР. № |
Z0411 |
28.05.23 |
|
М. В. Карелина |
|
|
|
|
|
|
|
|
номер |
|
подпись, дата |
|
инициалы, фамилия |
|
группы |
|
|
Номер студенческого билета: 2020/3477
Санкт-Петербург
2023

Цель работы:
познакомиться с основными способами реализации порождающих шаблонов проектирования GoF средствами Python.
Вариант 8. Задания 8 и 13.
Разработайте консольное приложение, которое моделирует создание электронных курсов с разными модулями и уровнями сложности. Объявите класс ElearningCourse с полями для хранения информации о курсе (название,
описание, модули, уровень сложности и т.д.). Напишите класс
ElearningCourseBuilder с методами для пошагового создания курса (set_title(), set_description(), add_module(), set_difficulty_level() и т.д.), после чего создайте несколько конкретных строителей для разных тематик курсов
(ProgrammingCourseBuilder, DesignCourseBuilder, MarketingCourseBuilder).
Пользователь должен иметь возможность выбрать тематику и уровень сложности курса, затем используйте соответствующий строитель для его создания и вывода информации о нем.
Текст программы:
class ElearningCourse: def __init__(self):
self.title = "" self.description = "" self.modules = [] self.difficulty_level = ""
def __str__(self):
return f"Title: {self.title}\nDescription: {self.description}\nModules: {self.modules}\nDifficulty Level: {self.difficulty_level}"
class ElearningCourseBuilder: def __init__(self):
self.course = ElearningCourse()
def set_title(self, title): self.course.title = title
def set_description(self, description): self.course.description = description
def add_module(self, module): self.course.modules.append(module)
def set_difficulty_level(self, difficulty_level): self.course.difficulty_level = difficulty_level
def get_course(self):

return self.course
class ProgrammingCourseBuilder(ElearningCourseBuilder): def __init__(self):
super().__init__()
self.course.title = "Programming Course"
self.course.description = "Learn to program in various languages" self.course.difficulty_level = "Intermediate"
def add_module(self, module): self.course.modules.append(f"Programming {module}")
class DesignCourseBuilder(ElearningCourseBuilder): def __init__(self):
super().__init__() self.course.title = "Design Course"
self.course.description = "Learn various design techniques" self.course.difficulty_level = "Beginner"
def add_module(self, module): self.course.modules.append(f"Design {module}")
class MarketingCourseBuilder(ElearningCourseBuilder): def __init__(self):
super().__init__()
self.course.title = "Marketing Course"
self.course.description = "Learn various marketing strategies" self.course.difficulty_level = "Advanced"
def add_module(self, module): self.course.modules.append(f"Marketing {module}")
class ElearningCourseDirector: def __init__(self):
self.builder = None
def set_builder(self, builder): self.builder = builder
def construct_course(self, difficulty_level): self.builder.set_difficulty_level(difficulty_level) self.builder.add_module("Introduction") self.builder.add_module("Intermediate") self.builder.add_module("Advanced")
def get_course(self):
return self.builder.get_course()
def main():
director = ElearningCourseDirector()
while True:
print("Choose a course:") print("1. Programming Course") print("2. Design Course") print("3. Marketing Course")
choice = input("Enter choice (1-3): ")
if choice == "1":

builder = ProgrammingCourseBuilder() break
elif choice == "2":
builder = DesignCourseBuilder() break
elif choice == "3":
builder = MarketingCourseBuilder() break
else:
print("Invalid choice. Please try again.")
while True:
difficulty_level = input("Enter difficulty level (Beginner, Intermediate, or Advanced): ")
if difficulty_level in ["Beginner", "Intermediate", "Advanced"]: break
else:
print("Invalid difficulty level. Please try again.")
director.set_builder(builder) director.construct_course(difficulty_level) course = director.get_course()
print("Course created:") print(course)
if __name__ == "__main__": main()
Результат выполнения:
Текст тестов:
import unittest from pr2 import *
class TestDesignCourseBuilder(unittest.TestCase): def test_add_module(self):
builder = DesignCourseBuilder() builder.add_module("Intermediate") builder.add_module("Advanced") course = builder.get_course()
expected_output = "Title: Design Course\nDescription: Learn various design techniques\nModules: ['Design Intermediate', 'Design Advanced']\nDifficulty Level: Beginner"
self.assertEqual(str(course), expected_output)

class TestElearningCourseDirector(unittest.TestCase): def test_create_programming_course(self):
director = ElearningCourseDirector() builder = ProgrammingCourseBuilder() director.set_builder(builder) director.construct_course("Intermediate") course = director.get_course()
expected_output = "Title: Programming Course\nDescription: Learn to program in various languages\nModules: ['Programming Introduction', 'Programming Intermediate', 'Programming Advanced']\nDifficulty Level: Intermediate"
self.assertEqual(str(course), expected_output)
def test_create_marketing_course(self): director = ElearningCourseDirector() builder = MarketingCourseBuilder() director.set_builder(builder) director.construct_course("Advanced") course = director.get_course()
expected_output = "Title: Marketing Course\nDescription: Learn various marketing strategies\nModules: ['Marketing Introduction', 'Marketing Intermediate', 'Marketing Advanced']\nDifficulty Level: Advanced"
self.assertEqual(str(course), expected_output)
if __name__ == '__main__': unittest.main()
Результат выполнения:
Разработайте консольное приложение, которое моделирует процесс логирования работы приложения. Напишите класс LoggerSingleton, в
котором реализуйте методы для записи сообщений разного уровня (info(), warning(), error() и т.д.). Пользователь должен иметь возможность использовать логгер для записи сообщений.
Текст программы:
class LoggerSingleton: __instance = None
def __init__(self):
if LoggerSingleton.__instance != None:
raise Exception("LoggerSingleton is a singleton class. Use getInstance() method instead")

else:
LoggerSingleton.__instance = self self.log_file = "log.txt"
@staticmethod
def getInstance():
if LoggerSingleton.__instance == None: LoggerSingleton()
return LoggerSingleton.__instance
def info(self, message):
print("[INFO]: {}".format(message)) self._write_to_log("[INFO]: {}".format(message))
def warning(self, message): print("[WARNING]: {}".format(message))
self._write_to_log("[WARNING]: {}".format(message))
def error(self, message): print("[ERROR]: {}".format(message))
self._write_to_log("[ERROR]: {}".format(message))
def log_from_input(self):
message = input("Введите сообщение: ") self._write_to_log("[INPUT]: {}".format(message))
def _write_to_log(self, message):
with open(self.log_file, "a") as f: f.write("{}\n".format(message))
logger = LoggerSingleton.getInstance() logger.log_from_input()
Результат выполнения:
Текст тестов:
import unittest
from h import LoggerSingleton
class TestLoggerSingleton(unittest.TestCase): def setUp(self):
self.logger = LoggerSingleton.getInstance()
def test_write_to_log(self):
self.logger._write_to_log("Test message for _write_to_log()") with open(self.logger.log_file, "r") as f:
self.assertTrue("Test message for _write_to_log()" in f.read())
def test_singleton_instance(self):
logger1 = LoggerSingleton.getInstance() logger2 = LoggerSingleton.getInstance()

self.assertEqual(logger1, logger2)
def test_log_file_exists(self): self.assertIsNotNone(self.logger.log_file)
if __name__ == '__main__': unittest.main()
Результат выполнения:
Вывод
В ходе выполнения данной работы мы поближе познакомились с абстрактными классами, а также получили навыки работы с порождающими шаблонами GoF. В моей работе были использованы паттерны Factory и Builder.