2013-06-13 2 views
4

От моделей дизайна для чайников:Класс завода - Дизайн модель для чайников

Там вы идете - у вас есть класс фабрики

enter image description here

То, что я понимается из заводского шаблона, что помогает избежать постоянной модификации кода всякий раз, когда необходимо создать новый объект. Но не нужно ли изменять функцию createConnection, чтобы создать и добавить другой объект? Итак, как это полезно?

Какой у меня недостаток?

ответ

3

Заводской шаблон может использоваться для ограничения количества изменений кода, которые вы должны выполнить. Использование кода в качестве примера, представьте, что вы есть много функций, которые используют соединения с базой данных

void ExampleMethod() { 
    var con = new MySqlConnection(); 

    // do something with con 
} 

И теперь вы хотите использовать Oracle вместо MySQL, так что вы должны изменить каждую строку, которая говорит new MySqlConnection в new OracleConnection.

Завод может решить эту проблему

void ExampleMethodUsingFactories() { 
    var con = factoryInstance.createConnection(); 
} 

factoryInstance где конкретизируется только один раз с factoryInstance = new FirstFactory("MySql"). Теперь изменение всей программы для использования Oracle становится тривиальным. Вам просто нужно заменить «MySQL» на «Oracle». Вам не нужно изменять методы, которые фактически используют соединение с базой данных.

Конечно, добавление нового механизма базы данных по-прежнему означает, что вы должны изменить заводской код, но это только в одном классе.

+0

Один вопрос: В приведенном выше примере вы видите «композицию» или «наследование»? Тип класса подключения используется внутри класса factoryA. C++. –

+0

Я тоже не думаю. Заводский класс не состоит из соединений, он создает и возвращает их. И вообще никакого наследования нет. – Dirk

+0

Может ли тот же код быть написан на C++? Я думаю, что концепция общественных классов в Java? –

1

Это ужасный дизайн. Это не SOLID. Чаще всего сравнение типов во время выполнения является признаком плохого дизайна. Полиморфизм - это ответ. Что еще хуже, этот завод может создавать только один вид коннекта, поэтому он должен сравнивать строки один раз, а не делать это при каждом вызове CreateConnection. Что еще хуже - струны. Почему бы не перечислять или статические ints? (Все ошибки этого примера, конечно, вызваны его демонстрационным характером. Но каждый пример такого рода должен иметь побочный эффект о недостатках - потому что он может придерживаться - когда вы читаете руководство, вы, естественно, утверждаете, что то, что он говорит, правильно)

надлежащий завод в этом случае:

public interface ConnectionFactory { 
    Connection createConnection(); 
} 

public class OracleConnectionFactory implements ConnectionFactory { 
    public Connection createConnection(){ 
     return new OracleConnection(); 
    } 
} 

public class SqlServerConnectionFactory implements ConnectionFactory { 
    public Connection createConnection(){ 
     return new SqlServerConnection(); 
    } 
} 

Insted из:

FirstFactory factory = new FirstFactory("Oracle"); 

Вы бы:

ConnectionFactory factory = new OracleConnectionFactory(); 

Если вы хотите новый вид подключения, вы бы добавить новый завод, и изменил одну строку, вы не должны модифицировать существующие классы.

+0

То, что вы описали, является абстрактным заводским методом, а не заводским методом. –

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