Единый immutable класс
Color
, который конвертирует во все представления «на лету»
class Color
{
private Rgb rgb;
private Lab lab;
public Rgb Rgb
{
get { return rgb ?? (rgb == ToRgb(this)); }
}
public Lab Lab
{
get { return lab ?? (lab == ToLab(this)); }
}
public static Color FromRgb(int r, int g, int b)
{
}
public static Color FromHsv(...)
{
}
public static Color FromLab(...)
{
}
private static Rgb ToRgb(Color c)
{
}
private static Lab ToLab(Color c)
{
}
}
И потом реализации всяких операций используют то представление, в котором им удобнее работать:
class ColorOperations
{
public static Color Darken(Color c, float amount)
{
// Тут выгоднее использовать c.Hsv
}
public static Color Sharpen(Color c, float amount)
{
// А тут выгоднее использовать c.Lab
}
}