Tag: 工厂模式

这是使用和测试使用工厂模式的类的正确方法吗?

我没有很多工厂模式的经验,我遇到过一个我认为有必要的情况,但我不确定我是否正确实施了模式,我担心它的影响我的unit testing的可读性。 我创建了一个代码片段,它近似(从内存中)我正在工作的场景的本质。 我真的很感激,如果有人可以看看它,看看我做了什么似乎是合理的。 这是我需要测试的类: public class SomeCalculator : ICalculateSomething { private readonly IReducerFactory reducerFactory; private IReducer reducer; public SomeCalculator(IReducerFactory reducerFactory) { this.reducerFactory = reducerFactory; } public SomeCalculator() : this(new ReducerFactory()){} public decimal Calculate(SomeObject so) { reducer = reducerFactory.Create(so.CalculationMethod); decimal calculatedAmount = so.Amount * so.Amount; return reducer.Reduce(so, calculatedAmount); } } 以下是一些基本的界面定义…… public interface ICalculateSomething { […]

工厂模式但具有对象参数

采用以下经典工厂模式: public interface IPizza { decimal Price { get; } } public class HamAndMushroomPizza : IPizza { decimal IPizza.Price { get { return 8.5m; } } } public abstract class PizzaFactory { public abstract IPizza CreatePizza(ItalianPizzaFactory.PizzaType pizzaType); } public class ItalianPizzaFactory : PizzaFactory { public enum PizzaType { HamMushroom, Deluxe, Hawaiian } public override IPizza […]

Factory Pattern可以构建许多派生类

我有一个工厂对象ChallengeManager来为我正在构建的游戏生成Challenge对象的实例。 有很多挑战。 每个Challenge类派生的构造函数都是不同的,但是它们之间有一个共同的接口,在基类中定义。 当我调用manager.CreateChallenge() ,它返回一个Challenge实例,它是派生类型之一。 理想情况下,我想在派生类本身内保留对象构造的代码,因此与该对象相关的所有代码都是共存的。 例: class Challenge {} class ChallengeA : Challenge { public static Challenge MakeChallenge() { return new ChallengeA(); } } class ChallengeB : Challenge { public static Challenge MakeChallenge() { return new ChallengeB(); } } 现在,我的ChallengeManager.CreateChallenge()调用只需要决定调用MakeChallenge()的类。 构造的实现包含在类本身中。 使用此范例,每个派生类都必须定义静态MakeChallenge()方法。 但是,由于该方法是静态的,我不能在这里使用接口,需要它。 这不是什么大问题,因为我可以很容易地记住为每个派生类添加正确的方法签名。 但是,我想知道是否应该考虑更优雅的设计。

工厂设计模式(需要批评)

我正在整理这个设计模式的解释和代码示例,试图帮助我周围的人抓住它(同时帮助自己掌握模式)。 我正在寻找的是对我的解释和代码示例的意见和批评……谢谢! 什么是工厂模式? 工厂模式利用特定的专用“对象创建者对象”来处理对象的创建 – 并且大多数时候实例化对象,类似于现实世界的工厂。 现实世界的例子 想象一下汽车工厂是各种类型汽车的创造者。 该汽车厂的一条assembly线可能有一天会生产一辆卡车,但是在另一天可能会重新生产汽车。 假设经销商向其指定的帐户处理部门下订单10辆汽车。 那个部门然后利用某个工厂并订购了10辆汽车。 账户处理人员并不关心自己制造汽车(想象效果不佳),他们只使用最终产品,确保经销商获得他们的车辆。 明年同一辆车的新车型出现,订单开始流入。账户处理人员(仍然不关心汽车的生产)下订单,但现在他们收到的汽车是不同的,assembly方法甚至是也许工厂可能会有所不同,但帐户处理人员不必担心这一点。 另外一个想法:车辆的工厂assembly商可能确切地知道如果某个帐户处理者下订单要采取什么行动(即,帐户处理者X下订单,工厂assembly工知道对于帐户处理者X,他们生产10辆Y型车辆)。 另一种选择可能是帐户处理程序告诉assembly工确切地生产什么类型的车辆。 如果帐户处理者也处理了车辆的创建(即它们被耦合),则每当车辆以任何方式改变时,每个帐户处理者将不得不在生产该车辆时进行再培训。 这会产生质量问题,因为有比工厂更多的帐户处理程序……会出现错误,费用会更高。 回到OOP 作为应用于软件工程的设计模式的对象工厂在概念上类似于上述示例…工厂生成各种类型的其他对象,您可以利用生成某种对象类型的assembly线(对象汇编器),返回到某种方式。 汇编程序可以检查请求客户端和句柄,或者客户端可以告诉汇编程序它需要什么对象。 现在……你正在一个项目并创建一个对象工厂和各种汇编程序,稍后在项目中,需求稍有变化,现在要求您更改对象内容以及客户端如何处理该对象。 由于您使用了工厂模式,这是一个简单的更改,在一个位置,您可以更改或添加工厂生成的对象,并更改汇编程序将对象内容放置的格式。 执行此操作的不幸方法是没有工厂方法,实例化每个对象实例并在客户端本身格式化对象内容…假设您在20个客户端中使用了此特定对象。 现在你必须去每个客户端,改变每个对象实例和格式……浪费时间……懒惰……第一次以正确的方式做到这一点,这样你就可以节省自己(和其他人)的时间并努力以后。 代码示例(C#) 以下是利用工厂生产食品和各种食品的例子 Factory module public enum FoodType { //enumerated foodtype value, if client wants to specify type of object, coupling still occurs Hamburger, Pizza, HotDog } /// /// Object to be […]

C# – Ninject,IoC和工厂模式

我有一个控制台应用程序,我需要根据用户的输入执行某个function。 如果用户输入“function1” – >我执行function1,依此类推。 我正在尝试将此项目编写为尽可能干净且通用,我想使用IoC和SOLID概念,我有点卡住了。 到目前为止我所拥有的: public interface IFeature { String execFeature(); } 和 interface IFeatureFactory { IFeature createFeature(String input); } 我的第一个想法只是在具体的Factory类上有一个关于用户输入的开关案例 ,并相应地创建具体的function ,但我敢打赌,有一个更好的方法来使用IoC 。 我读了Ninject工厂扩展,但不明白如何在我的项目中使用它。 使用IoC / Ninject进行工厂模式的最佳方法是什么?

GoF Factory的命名约定?

此模式使用抽象工厂,然后是工厂的实现。 我确信这两个类有一个标准的命名约定,但我不知道它是什么。 例如: public abstract class ChocolateFactory { }; public class MyChocolateFactory { } : ChocolateFactory 这里的标准惯例是什么? 我正在考虑ChocolateFactoryBase或ConcreteChocolateFactory,但也许还有别的东西(很像Enum往往以Enum为后缀,例如PetTypeEnum这样你就可以做PetTypeEnum PetType; 希望这不是主观的。

键入Casting和Factory模式

我正在努力弄清楚如何在我试图创建的DTO映射器中实现工厂模式。 我很确定我需要重新考虑我的设计。 这是我正在运行的一个非常小的例子: public abstract class Person { public string Name { get; set; } public decimal Salary { get; set; } } public class Employee : Person { public Employee() { this.Salary = 20000; } } public class Pilot : Person { public string PilotNumber { get; set; } public Pilot() { this.Salary = […]

满足开放/封闭原则的工厂模式?

我有以下具体的Animal产品: Dog和Cat 。 我正在使用参数化的Factory方法来创建所述产品。 根据传递给Factory方法的AnimalInfo参数,将创建具体产品。 映射逻辑放在Factory方法中。 这是我的代码: public abstract class AnimalInfo { public abstract String Sound { get; } } public class DogInfo : AnimalInfo { public override string Sound { get { return “Bark”; } } } public class CatInfo : AnimalInfo { public override string Sound { get { return “Meow”; } } […]

用AutoFac替换出厂

我习惯于创建我自己的工厂(如图所示): public class ElementFactory { public IElement Create(IHtml dom) { switch (dom.ElementType) { case “table”: return new TableElement(dom); case “div”: return new DivElement(dom); case “span”: return new SpanElement(dom); } return new PassthroughElement(dom); } } 我终于开始在我当前的项目中使用IoC容器(AutoFac)了,我想知道是否有一些使用AutoFac优雅地实现同样function的神奇方法?

为什么我得到“类型参数必须是无效的……”错误?

我将尝试缩短此代码示例: public interface IThing { //… Stuff } public class Thing1 : IThing { } public class Thing2 : IThing { } public interface IThingView { ICollection ViewAll(); } public class ThingView : IThingView { ICollection ViewAll() { return new List(); } // There’s a big operation here } public interface IThingViewerFactory { public IThingView […]