Все, что я вижу в классах членства, кажется независимым от какой-либо учетной записи, если это правда:
В каждой системе есть только 1 экземпляр каждого подкласса, поэтому всего из 3, и каждый является синглтоном.
Факт IMembership агрегаты userAccount не имеет смысла, он не должен знать учетные записи
Вероятно, учетная запись связана с одним и только одним из трех синглтонов, что позволяет учетной записи знать пределы и рассчитывать проценты. В этом случае у вас есть направленная ассоциация от userAccount до IMembership
Это ненормально атрибуты drawLimit и TransfertLimit присутствуют в четырех классах членства, они должны присутствовать только в IMembership , чей должен быть абстрактный класс, а не интерфейс
Для меня userAccount должен быть абстрактным классом, поскольку вы не можете иметь учетную запись, которая не является одним из двух подклассов.
Операции getWithdrawLimit и getTransfertLimit зависят только от членство, поэтому они определены на userAccount , а не на подклассах, конечно, эти операции вызывают соответствующий на связанном экземпляре членства.
(я не определил конструктор для экономии времени)
Да, в случае currentAccount вычисление процентов бесполезно, но если вы хотите избежать необходимости удваивать классы членства, то направленная ассоциация к членству относится не к userAccount , а к каждому подклассу, а операции getWithdrawLimit и getTransfertLimit являются абстрактными в userAccount . Это сложнее, и я не думаю, что это стоит усилий