1.1 Addition or removal of a concrete implementor does not need code modification
1.2 Addition or removal of a refined abstraction does not need code modification
2.1 Minimal number of concrete implementor
2.2 Maximal factorization of the link between abstraction and implementorIn this solution, there is a real separation between the windows style and their content. It is possible to add a new style or a new type without modifying existing code.
Probably the worst case with Abstraction under Concrete Implementor