factory method pattern
prorotype pattern