Builder设计模式和Factory设计模式有什么区别?
哪一个更有利,为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图表?
design-patterns factory-method factory-pattern builder-pattern
引用依赖注入的大多数示例,我们也可以使用工厂模式解决.看起来在使用/设计时,依赖注入和工厂之间的差异是模糊的还是薄的.
一旦有人告诉我你如何使用它会有所作为!
我曾经使用StructureMap一个DI容器来解决问题,后来我重新设计它以使用一个简单的工厂并删除了对StructureMap的引用.
任何人都可以告诉我他们之间的区别是什么,在哪里使用什么,这里最好的做法是什么?
我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西.
从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品.我的第一个问题是抽象工厂.它的作用是允许您创建具体对象的族(可能取决于您使用的特定工厂)而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?
我的最后两个问题是关于我在很多地方看到过的单一引言,我无法完全理解:
两者之间的一个区别是,使用抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化.
我的理解是工厂方法模式有一个Creator接口,它将使ConcreteCreator负责知道要实例化的ConcreteProduct.这是通过使用继承来处理对象实例化的意思吗?
现在关于那个引用,抽象工厂模式究竟是如何通过合成将对象实例化的责任委托给另一个对象?这是什么意思?看起来抽象工厂模式也使用继承来完成构建过程,但是我仍然在学习这些模式.
任何帮助,尤其是最后一个问题,将不胜感激.
design-patterns factory-method factory-pattern abstract-factory
什么时候在对象中使用工厂方法而不是Factory类是个好主意?
任何人都可以解释工厂和战略模式之间的区别吗?
对我来说,除了额外的工厂类(在工厂模式中创建产品对象)之外,两者看起来都相同
java design-patterns strategy-pattern factory-pattern abstract-factory
我想将值传递给实现我的服务的类的构造函数.
但是,ServiceHost只允许我传递要创建的类型的名称,而不是传递给其构造函数的参数.
我希望能够传入一个创建我的服务对象的工厂.
到目前为止我发现了什么:
无参数构造函数是一个要求(像Hibernate这样的工具在这个构造函数上使用反射来实例化对象).
我得到了这个手作波形的答案,但有人可以进一步解释吗?谢谢
我有一系列工厂回归unique_ptr<Base>
.引擎盖下,虽然,他们所提供的指针各种衍生类型,即unique_ptr<Derived>
,unique_ptr<DerivedA>
,unique_ptr<DerivedB>
等
鉴于DerivedA : Derived
并且Derived : Base
我们有:
unique_ptr<Base> DerivedAFactory() {
return unique_ptr<Base>(new DerivedA);
}
Run Code Online (Sandbox Code Playgroud)
我需要做的是将指针从返回"转换" unique_ptr<Base>
到某个派生级别(不一定是原始的内部级别).用伪代码说明:
unique_ptr<Derived> ptr = static_cast<unique_ptr<Derived>>(DerivedAFactory());
Run Code Online (Sandbox Code Playgroud)
我正在考虑通过从中释放对象unique_ptr
,然后使用一个转换原始指针的函数并将其重新分配给另一个unique_ptr
所需的风格(release
在调用之前由调用者显式完成)来实现这一点:
unique_ptr<Derived> CastToDerived(Base* obj) {
return unique_ptr<Derived>(static_cast<Derived*>(obj));
}
Run Code Online (Sandbox Code Playgroud)
这是有效的,还是/会有什么时髦吗?
PS.还有一个复杂的问题是,有些工厂驻留在运行时动态加载的DLL中,这意味着我需要确保生成的对象在创建它们的同一个上下文(堆空间)中被销毁.所有权的转移(通常发生在另一个上下文中)必须从原始上下文中提供删除.但除了必须与指针一起提供/转换删除器之外,铸造问题应该是相同的.
我一直在使用工厂方法创建模式一段时间.我刚刚被告知这个:
public static class ScheduleTypeFactory
{
public static IScheduleItem GetScheduleItem(ScheduleTypeEnum scheduleType)
{
IScheduleItem scheduleItem = null;
switch (scheduleType)
{
case ScheduleTypeEnum.CableOnDemandScheduleTypeID:
{
scheduleItem = new VODScheduleItem();
break;
}
case ScheduleTypeEnum.BroadbandScheduleTypeID:
{
scheduleItem = new VODScheduleItem();
break;
}
case ScheduleTypeEnum.LinearCableScheduleTypeID:
{
scheduleItem = new LinearScheduleItem();
break;
}
case ScheduleTypeEnum.MobileLinearScheduleTypeID:
{
scheduleItem = new LinearScheduleItem();
break;
}
}
return scheduleItem;
}
}
Run Code Online (Sandbox Code Playgroud)
不是我的"技术"主管的工厂方法创建模式,而没有告诉我为什么或给我她的解释.我很友好地要求解释,她告诉我她没有时间.我被告知要重命名它.如果我错了,那么毫无疑问我会接受我已经错误地实施了多年.这是你如何实现工厂方法创建模式?提前致谢.
我想知道如何用Spring 3注释实现简单的工厂模式.我在文档中看到,您可以创建调用工厂类并运行工厂方法的bean.我想知道这是否可能只使用注释.
我有一个目前正在呼叫的控制器
MyService myService = myServiceFactory.getMyService(test);
result = myService.checkStatus();
Run Code Online (Sandbox Code Playgroud)
MyService是一个名为checkStatus()的方法的接口.
我的工厂类看起来像这样:
@Component
public class MyServiceFactory {
public static MyService getMyService(String service) {
MyService myService;
service = service.toLowerCase();
if (service.equals("one")) {
myService = new MyServiceOne();
} else if (service.equals("two")) {
myService = new MyServiceTwo();
} else if (service.equals("three")) {
myService = new MyServiceThree();
} else {
myService = new MyServiceDefault();
}
return myService;
}
}
Run Code Online (Sandbox Code Playgroud)
MyServiceOne类如下所示:
@Autowired
private LocationService locationService;
public boolean checkStatus() {
//do stuff
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,locationService变量为alwasy null.我相信这是因为我在工厂里自己创造了这些物品并且没有发生自动装配.有没有办法添加注释才能使其正常工作?
谢谢
factory-pattern ×10
java ×3
annotations ×1
c# ×1
c++ ×1
c++11 ×1
creation ×1
factory ×1
hibernate ×1
orm ×1
spring ×1
unique-ptr ×1
wcf ×1