Лучше использовать конструктор или метод фабричного шаблона? - PullRequest
3 голосов
/ 02 мая 2010

У меня есть класс-оболочка для класса Bitmap, который называется BitmapZone.

Предполагая, что у нас есть растровое изображение WIDTH x HEIGHT, этот класс-обертка должен служить для того, чтобы я мог сам отправлять другим методам / классам вместо исходного растрового изображения. Затем я могу лучше контролировать, что пользователь может или не может делать с изображением (и мне не нужно много раз копировать растровое изображение для отправки для каждого метода / класса).

Мой вопрос: зная, что все BitmapZone созданы из растрового изображения, что вы считаете предпочтительным?

Синтаксис конструктора: что-то вроде

BitmapZone bitmapZone = new BitmapZone(originalBitmap, x, y, width, height);

Шаблон фабричного метода:

BitmapZone bitmapZone = BitmapZone.From(originalBitmap, x , y, width, height);

Шаблон фабричного метода:

BitmapZone bitmapZone = BitmapZone.FromBitmap(originalBitmap, x, y, width, height);

Другое? Почему?

Спасибо

Ответы [ 4 ]

2 голосов
/ 02 мая 2010

Я бы использовал второй фабричный метод - он делает ваш код более читабельным и интуитивно понятным для использования. Если вы не читали книгу «Эффективная Java» Джошуа Блоха, вам лучше это сделать - это отличная книга, и хотя она не о C #, она отлично ответит на ваш вопрос.

2 голосов
/ 02 мая 2010

В этом случае я не вижу причин использовать статический метод. Конструктор работает хорошо и является «очевидным» способом создания новой BitmapZone.

Обычно вы прибегаете к статическому методу, если хотите изменить поведение конструкции. Например, механизм кэширования, который возвращает ранее созданный экземпляр, если параметры совпадают. Это не может быть реализовано с помощью конструктора, который всегда будет возвращать новый экземпляр.

1 голос
/ 02 мая 2010

Поместите метод в Bitmap вместо BitmapZone.

BitmapZone bitmapZone = originalBitmap.GetZone(x, y)

Вы сказали это сами: «Каждая BitmapZone создается из Bitmap». Таким образом, вы переходите от пяти параметров к двум, поскольку вам не нужно передавать растровое изображение, и каждое растровое изображение, вероятно, знает свои собственные ширину и высоту.
(Как ты собирался поступить иначе? new BitmapZone(originalBitmap, x, y, originalBitmap.Width, originalBitmap.Height)? Гадкий.)

Если вы не можете изменить класс Bitmap, сделайте его методом расширения (хотя, конечно, это не будет работать в Java).

1 голос
/ 02 мая 2010

Я бы предпочел последний пример (BitmapZone.FromBitmap) над средним, только потому, что он более понятен по своему предназначению, с незначительным снижением краткости. Честно говоря, у меня нет никакого предпочтения между первым и последним примерами; используйте шаблон, который подходит вашей архитектуре лучше всего. Изучите достоинства и недостатки шаблона фабричного метода - подходит ли он вам в этом случае, зависит от особенностей вашего дизайна.

Я бы начал с простого и понятного конструктора, если только у меня не было веской причины поступить иначе.

...