Question

I have car factories that build cars of different sizes. I have 2 factories: USA and Thailand that make car sizes Big, Middle, and Little. But I have a problem: the Thailand factory does not make big cars.

Code:

public enum CarSize { Big, Middle, Little,}

public interface ICarFactory {
    ICar CreateCar(CarSize carSize);
}

public class USACarFactory : ICarFactory {
    public ICar CreateCar(CarSize carSize) {
        ICar car = null;
        switch (carSize) {
            case CarSize.Little:
                car = new USALittleCar();
                break;
            case CarSize.Middle:
                car = new USAMiddleCar();
                break;
            case CarSize.Big:
                car = new USABigCar();
                break;
        }
        return car;
    }
}

public class ThailandCarFactory : ICarFactory {
    public ICar CreateCar(CarSize carSize){
        ICar car = null;
        switch (carSize) {
            case CarSize.Little:
                car = new ThailandLittleCar();
                break;
            case CarSize.Middle:
                car = new ThailandMiddleCar();
                break;
            case CarSize.Big:
                //no big cars in Thailand!!!!
                break;
        }
        return car;
    }
}

public interface ICar { }

public class USABigCar : ICar { }
public class USAMiddleCar : ICar { }
public class USALittleCar : ICar { }

public class ThailandMiddleCar : ICar { }
public class ThailandLittleCar : ICar { }

What should I do? Is my Abstract Factory poorly designed?

Was it helpful?

Solution

@zzfima, picking up the idea from COM, how about querying the interface and find out it if supports creating car of a specified size and invoke suitably? The code definitely realizes the abstract factory pattern.

OTHER TIPS

case CarSize.Big:
            car = new ThailandBigCar();
            break;

Try that. That should allow you to make big cars.

public interface ICar { }

public class USABigCar : ICar { }
public class USAMiddleCar : ICar { }
public class USALittleCar : ICar { }

public class ThailandMiddleCar : ICar { }
public class ThailandLittleCar : ICar { }
public class ThailandBigCar : ICar { }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top