ANSI C を使用してファクトリ パターンを実装する方法についてのリファレンスを教えてもらえますか? より多くのパターンがカバーされている場合は、ボーナスになります. C++ でこれを行うのは簡単なことですが、C にはクラスとポリモーフィズムがないため、その方法がよくわかりません。私は、すべての共通データ型を持つ「基本」構造体を持ち、次に void ポインターを使用し、構造体のすべての共通部分を上部の基本構造体と同じ順序で定義することを考えていましたか? それとも、メモリ内で同じようになることが保証されていませんか?
8351 次
4 に答える
7
ファクトリ パターンは C で実装することもできます。インターフェイスが定義する操作が次のとおりであるとします。
typedef int (*operations_1) (void *data);
typedef int (*operations_2) (void *data);
typedef struct impl_ops_t
{
operations_1 op1;
operations_2 op2;
} impl_ops_t;
したがって、そのようなインターフェースを実装する実装インスタンスを取得できるようにするには、データと操作の両方を含む構造を定義する必要があります。次に、その構造を返す作成操作と、おそらく破棄操作も定義できます。
typedef struct ctx_t
{
void *data;
impl_ops_t *operations;
} ctx_t;
typedef ctx_t (*create_handle) (void);
typedef void (*destroy_handle) (ctx_t **ptr);
typedef struct factory_ops
{
create_handle create;
destroy_handle destroy;
} factory_ops;
また、ファクトリ メソッドを提供する関数を定義する必要があります。おそらく、ニーズに基づいて適切な実装を取得する方法が必要です (おそらく、以下の例のような単純なパラメーターではありません)。
typedef enum IMPL_TYPE
{
IMPL_TYPE_1,
IMPL_TYPE_2
} IMPL_TYPE;
factory_ops* get_factory(int impl_type);
したがって、次のように使用されます。
main (...)
{
factory_ops fact = get_factory(IMPL_TYPE_2);
// First thing will be calling the factory method of the selected implementation
// to get the context structure that carry both data ptr and functions pointer
ctx_t *c = fact->create();
// So now you can call the op1 function
int a = c->operations->op1(c->data);
// Doing something with returned value if you like..
int b = c->operations->op2(c->data);
// Doing something with returned value if you like..
fact->destroy(&c);
return 0;
}
于 2013-03-26T18:38:07.943 に答える
1
ここでは、ページの下部に、C のパターンに関する一連の記事があります。
于 2010-07-08T14:39:24.067 に答える
1
C には関数ポインタと構造体があります。したがって、C でクラスを実装できます。
このような何かがあなたに手がかりを与えるはずです。
void class1_foo() {}
void class2_foo() {}
struct polyclass
{
void (*foo)();
};
polyclass make_class1() { polyclass result; result.foo = class1_foo; return result; }
于 2010-07-08T14:22:50.123 に答える
0
Factory パターンは、オブジェクト指向の設計パターンです。
C はオブジェクト指向言語ではありません。
したがって、C の Factory の目標は何かを質問します。
于 2010-07-08T14:22:31.463 に答える