2014-10-08 1 views
0

Im в настоящее время реализует абстрактный шаблон фабрики для подключения к базе данных, мне нужно отделить бизнес-логику и иметь код, который не нужно переписывать для каждого нового типа базы данных, который должен подключаться к мое заявление, Так что на данный момент у меня есть эти классыАбстрактная реализация интерфейса шаблона фабрики или расширение класса

Interface Connection{} 
MySql implements Connection{} 
PostgreSql implements Connection{} 

Таким образом, проблема здесь в том, что каждый класс, который реализует интерфейс подключения должен переписать методы в интерфейсе, я должен был бы класс, где есть общие такие методы, как setStatement, executeQuery и т. д., но затем методы som должны быть перезаписаны подобно методу подключения, который будет отличаться в зависимости от баз данных etype,

Прежде всего я хочу иметь дополнительный класс между интерфейсом Connection и подклассами , где методы хранятся и используются, если они не переопределены, но это решение не похоже на правильный путь (исправьте меня, если im неправильно)

Interface ConnectionInterface{} 
class Connection{} 
MySql extends Connection{} 
PostgreSql extends Connection{} 

Благодаря

+1

Я бы просто использовать другое имя. Соединение уже является объектом JDBC. – Leo

+1

имя моего класса на самом деле ConnectionBase, но thx anyways – MRK187

ответ

2

Ничего плохого в этом нет. Но я бы сделал это вот так:

interface Connection{} 
abstract class AbstractConnection implements Connection {} 
final class MySql extends AbstractConnection{} 
final class PostgreSql extends AbstractConnection{} 

С помощью Java 8 вы также можете использовать методы по умолчанию в интерфейсе и исключить абстрактный класс.

Совершенно альтернативным подходом будет класс DefaultConnectionOperations, который предоставляет методы. Тогда у вас может быть объект этого класса, который вводится в каждую Connection-Implementation. Но это спорно, если инъекции зависимостей необходимы в вашем случае.

+0

моя проблема в том, что мы все еще используем java 1.6. – MRK187

+0

Что делать, если я подключаюсь к абстрактному классу и имею общие методы и переменные в этом классе и подклассы переопределяют некоторые из методов, которые будут отличаться в их impl? повлияет ли это на заводскую модель? – MRK187

+0

@ MRK187 Вы можете это сделать, но возвращаемый тип фабричного метода не должен быть абстрактным классом, а интерфейсом, который реализует абстрактный класс. Вы всегда должны использовать интерфейсы, потому что даже абстрактный класс, содержащий реализацию по умолчанию, может быть заменен. – UniversE

0

Я не понимаю, почему бы не рассмотреть вопрос о наложении State design pattern. Вот еще very good post - почему?

Поступая таким образом

каждая новая база данных типа

может изменить в Connection поведение, когда его изменения типа. Также будет отображаться уже измененный соответствующим образом. Шаблон состояния также позволяет сохранять атрибуты прежнего состояния, даже когда состояние изменяется после этого.

Псевдо код реализации:

class Connection{ 
private State _state; 
} 

abstract class State{ 
protected Connection connection; 
} 

class MySqlState extends State{} 
class PostgreSqlState extends State {} 
+0

Хорошо, я проверю это, – MRK187

+0

allthough это похоже на ужасную работу, я мог бы просто иметь абстрактный класс toplevel и наследовать другие классы, В чем разница? Похоже, что трудно добиться такого же эффекта. – MRK187

+0

Лучшая тестируемость. Посмотрите на преимущество №5 (модульное тестирование) в этой базе данных [post] (http://codebetter.com/jeremymiller/2006/04/30/the-state-pattern-an-underappreciated-pattern/) и как это связано с Правило «* одобрение композиции над наследованием *» в дизайне OO. – ekostadinov

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