2010-05-02 4 views
3

У меня есть класс обертки для класса Bitmap, называемого BitmapZone.Лучше использовать конструктор или метод заводского шаблона?

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

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

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

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

Factory Method Шаблон:

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

Factory Method Шаблон:

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

Другое? Зачем?

Благодаря

ответ

1

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

BitmapZone bitmapZone = originalBitmap.GetZone(x, y) 

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

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

+0

Bitmap - это системный класс, который вы не контролируете. –

+0

Вы должны быть Java-парнем: P Bitmap - это.NET framework, поэтому я не могу этого сделать: (Хотя я мог бы добавить это как метод расширения (который заставит его работать так же, как вы сказали). –

+0

См. Мое редактирование :) Я _just_ предложил сделать его методом расширения. – tzaman

1

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

Сам, я бы начал с простого и простого конструктора, если у меня не было веских оснований для этого.

2

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

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

+0

Я собирался сказать то же самое: кеширование. Это имеет смысл для неизменяемых объектов – Phil

2

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

Смежные вопросы