update
add factory GoF