放假无聊在家看设计模式《head first系列》,今天看了工厂模式,分为三种:
简单工厂模式
工厂模式
抽象工厂模式
首先这3个奇葩的名字,我真是醉了,虽说干了很多年,但是真还没怎么用过,这些东西都是各类框架实现的技术,比如spring,jdbc以及log4j之类的,真实的业务场景我还真没咋用过,谁帮忙普及下。
别整网上那些没营养的例子,什么汽车啊,鸭子啊,披萨啊,真是无聊,难道都不是用数据库表存各种属性吗?非要建立出那么多类,可能是想帮助人理解吧,但实际业务场景压根没有啊,谁说出来我服谁?求喷!
我后续还有若干求喷文,希望大家踊跃的喷我~
迷茫2017-04-17 17:37:54
これはビジネスでは使用されないということは理解できます。また、UUID オブジェクトなど、クラス名が Factory であるものだけがファクトリーであるとは考えないでください。UUID には現在 4 つのバージョンがありますが、どれもインスタンス化されていません。これらは、Factory Produce のさまざまなバージョンの UUID を通じてインスタンス化されます。この設計の理由は、通常、同じインターフェイス クラスをグループ化して抽象化した後、統合管理に便利であるためです。エンコーディング文字セット
へ大家讲道理2017-04-17 17:37:54
何年も働いているのに、まだ出会いがないというのは悲劇です。まず、大企業への転職を検討すれば、必ず出会いはあります。
最も単純なファクトリ モードは、リレーショナル/非リレーショナル データベースの切り替え、バージョンの切り替え、およびクラス ライブラリの切り替えです。待ってください。これが発生しなかったのは、ポストメンテナンスの必要がない、またはバージョンの反復やデータベースの更新を考慮する必要がないからですよね?
他のデザインパターンにも独自の機能があります。これに遭遇しないと、これは非常に使いやすいと感じます。継承とポリモーフィズムを非常に巧妙に利用できます。
さらに、プログラマーの進歩は、フレームワークのソース コード、言語のソース コード、大規模な同時実行性、およびコードの保守性を研究することです。
高洛峰2017-04-17 17:37:54
jdk の例を見てみましょう。Executors クラスには newFixedThreadPool の静的メソッドがあり、インターフェイスは次のように定義されています。 リーリー
ご覧のとおり、2 番目のパラメーターをスレッド ファクトリに渡すことができ、Executors クラスはファクトリ メソッドに基づいてスレッド プールに必要なスレッドを作成できます。つまり、スレッドを作成するためのすべてのルールを ThreadFactory に記述することができます。たとえば、ファクトリで作成されたスレッド名に XXX-prefix を付けたり、スレッドの優先順位を指定したりすることができます。これはファクトリーパターンの最も一般的なシナリオと言え、さまざまなフレームワークで広く使用されています。本を読みながらデザインパターンを学び、実際のコードを読んでいくと、パターンの具体的な機能やさまざまな巧妙なテクニックが自然とわかります。
黄舟2017-04-17 17:37:54
ファクトリ パターンであっても、その他の作成パターンであっても、それらはすべてオブジェクトを初期化するという 1 つの目的を持っています。言い換えれば、データ構造モデル (クラスとオブジェクト自体がカスタム データ構造です) を構築するためです。
それでは、なぜこの方法でオブジェクトを作成し、デザイン パターンを使用できるのかという疑問が生じます。基本的に、その理由は、上位レベルのユーザーがオブジェクトを初期化するために new を直接使用したくないからです。 new
オブジェクト作成プロセスが上位レベルのユーザーから分離される、または オブジェクト作成プロセスが複雑でユーザーにとって習得が難しい です。 🎜> ; または オブジェクトの作成は特定の条件 を満たさなければなりません。これらの条件がビジネス ニーズであれ、システムの制約であれ、上位レベルのユーザーにそれを習得させ、他のユーザーによる開発の難易度を高める必要はありません。
それで、ここまでで明確にしておきたいのですが、それがファクトリーモードであろうと、上記の同志が言及した開閉原理であろうと、それはいくつかの複雑なプロセスを隔離して、これらの複雑なプロセスが外界にさらされないようにすることです。公開された場合 これらのプロセスは、チームワークと呼ばれ、ユーザーに迷惑をかけることになります。オブジェクト指向のカプセル化自体は、外部の
を可能な限り単純にすることです。 API
フィールドを定義しますが、ビジネス上の理由から、このフィールドはステータスを表すために整数を使用する必要があります。まあ、数字が少ないほうが扱いやすいですが、数字が多いと、上位ユーザーは各数字が表すステータスを明確に覚えていない可能性があります(たとえば、音声通信システムを作成したい場合、その場合、音声機器には多くのステータス番号があります)。このとき、Status
を使用してオブジェクトを作成し、その後に new
に値を代入すると、開発ドキュメントを参照する必要が生じ、誤って間違った値を指定してしまう可能性があります。現時点では、ファクトリ パターンまたはその他の適切な設計パターンを使用してコードを構築することもできます。 Status
リーリー
もちろん、列挙型を使用することもできます。端的に言えば、それは設計者の希望次第です。つまり、デザイン パターンは、どのシナリオで使用する必要があるのかを示しているわけではありません。より正確に言うと、デザイン パターンを使用すると、チーム メンバーに利便性がもたらされるか、コードの品質が向上するか、ということになります。いくつかのエラーを回避しますか?もしそうなら、それが複雑になるだけで何のメリットもないなら、それを使用してください。
一言で言えば、それを使用するかどうかは関係なく、使用することはチームにとっても、製品の品質にとっても、製品の保守性にとっても利益をもたらします。使用するかどうかに関わらず、チームワークと製品指向でなければなりません。これがソフトウェア設計者の基本要件です。