Wondering how people to design object and use of design pattern in a program.

For example:

Let's say I have two types of car ( BMW, Benz ) and two colors ( Black, White ),
but the color object already exist with two methods which are

```
[Color initWithBlack];
[Color initWithWhite];

```

Define two methods in .h file

```
- (Car *)makeWithType:(NSString *)type;
- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color;

```

In .m file

```
- (Car *)makeWithType:(NSString *)type
{
    // default is black
    return [self makeWithType:type andColor:@"black"];
}

- (Car *)makeWithType:(NSString *)type andColor:(NSString *)color
{
    Car *car = [[Car alloc] init];
    car.type = type;
    switch(color) {
        case "black":
            [car addColor:[Color initWithBlack]];
            break;
        case "white":
            [car addColor:[Color initWithWhile]];
            break;
        default:
            break;
    }
    return car;
}

```

Is it the proper way to define and implement objects?

Are there any dependency coupling loose or tight?

If it is tight, how can I improve the design in order to reduce the coupling?