0

C# 中的代码

    class Program
    {
        static void Main(string[] args)
        {
            var benzCar = new CarClient(new BenzCarFactory());
            var bmwCar = new CarClient(new BmwCarFactory());
            benzCar.BuildCar();
            bmwCar.BuildCar();
        }
    }

    public interface Wheel { }
    public interface Door { }
    public interface Body { }

    public class BenzWheel : Wheel { }
    public class BmwWheel : Wheel { }
    public class HondaWheel : Wheel { }

    public class BenzDoor : Door { }
    public class BmwDoor : Door { }
    public class HondaDoor : Door { }

    public class BenzBody : Body { }
    public class BmwBody : Body { }
    public class HondaBody : Body { }

    public interface CarFactory
    {
        Body BuildBody();
        Wheel BuildWheel();
        Door BuildDoor();       
    }

    public class BenzCarFactory: CarFactory {
        public Body BuildBody() { return new BenzBody(); }
        public Wheel BuildWheel() { return new BenzWheel(); }
        public Door BuildDoor() { return new BenzDoor(); }
    }
    public class BmwCarFactory : CarFactory
    {
        public Body BuildBody() { return new BmwBody(); }
        public Wheel BuildWheel() { return new BmwWheel(); }
        public Door BuildDoor() { return new BmwDoor(); }
    }

    public class HondaCarFactory : CarFactory
    {
        public Body BuildBody() { return new HondaBody(); }
        public Wheel BuildWheel() { return new HondaWheel(); }
        public Door BuildDoor() { return new HondaDoor(); }
    }

    public class CarClient
    {
        private CarFactory _carFactory;
        public CarClient(CarFactory factory)
        {
            _carFactory = factory;
        }

        public void BuildCar()
        {
            _carFactory.BuildBody();
            _carFactory.BuildDoor();
            _carFactory.BuildWheel();
            // Remaining Business logic to assemble the parts and build a car.
        }       
    } 
  1. 这是一个有效的抽象工厂吗?
  2. 你认为不同的设计模式会比这更好吗?
  3. 为了简单起见,我只添加了三个部分。当我们的其他部分很少时,我们是否应该将“Builder”模式与抽象工厂结合起来构建 Car 对象?
4

1 回答 1

1

这似乎是一种有效的抽象工厂模式——您要确保只有特定品牌的零件才能与特定品牌的汽车搭配使用。

但是,我不得不对你的班级设计感到不满。

  • 你有一个实际上不生产汽车的 CarFactory?
  • 但是你有一个汽车客户呢?
  • 此外,接口应该用于在不同实现中的行为在功能上有所不同的类。

从一辆车到另一辆车,轮子/门在功能上没有什么不同。相同的车轮/轮胎可以用于数十种汽车模型系列。车轮具有属性,但功能相同。宝马不能声称拥有 17 英寸车轮的排他性。

所以,在你的抽象工厂实现上做得很好:) 但是继续你的对象设计。

对于抽象工厂模式的一个很好的例子,看看 Java 是如何做它的 UI 工具包的,并在它不存在的桌面应用程序世界中改变 UI 主题

于 2014-05-13T19:04:07.453 回答