什么是最简单,最像Ruby的方式让一个构造函数返回一个合适类型的对象?
更具体地说,这是一个虚拟的例子:说我有两个类Bike和Car哪个子类Vehicle.我要这个:
Vehicle.new('mountain bike') # returns Bike.new('mountain bike')
Vehicle.new('ferrari') # returns Car.new('ferrari')
Run Code Online (Sandbox Code Playgroud)
我已经在下面提出了一个解决方案,但它的使用allocate似乎太过实现了.有什么其他方法,或者我的确实可以吗?
我试图简洁地描述何时使用工厂,我自己和我的团队.我遇到了以下相关问题,这有点帮助:
基于这些链接以及一系列其他来源(在下面列出),我提出了以下内容:
何时使用抽象工厂模式:
说明:
"我是否为每种对象类型创建了一个工厂?这看起来过分了."
何时不使用工厂:
参考文献:
我的问题是:我的摘要是否准确,是否有意义?有什么我忽略的吗?
提前致谢.
language-agnostic oop design-patterns factory factory-pattern
C#工厂模式是否需要向上转换?
我希望上课在图书馆G中在班级图书馆A中创造一个亚当,而不使G依赖于A.上帝在班级图书馆E中为夏娃制作亚当斯,夏娃可以知道并依赖亚当.(编辑 - 这个样本越来越好:)
我能想到的解决方案是在A中有一个AdamFactory.这样AdamFactory知道Adam并且可以很容易地创建它(可能只是调用Adam的构造函数).上帝收到一个AdamFactory,可以命令CreateAdam.
现在,因为上帝不被允许认识亚当,AdamFacotry的CreateAdam必须返回一个物体,这需要Eve将AdamFactory返回的物体向上投射到亚当身上.
我认为这会奏效.然而,我对上传感到不安,因为这是禁忌.这真的是必须的吗?
PS - 没有Blasphemy的意图,如果某人的感受受到伤害我会道歉.使用上帝和亚当而不是创造者和创造似乎更好,因为后两个词彼此太相似了.
编辑:重新接口建议.让我们假设Adam有两种方法:ProvideLove,ProvideFood和ProvideProtection(我们保持这个样本是kis-safe :).夏娃将亚当用于这两个目的,但当然上帝没有.那么为什么要向上帝提供AdamFactor返回实现IAdam而不仅仅是对象的东西的知识呢?我不明白!
编辑:工作代码(同一个库中的每个人,我的目标是分离到不同的库)看起来像这样:
Adam God.LoadAdam(AdamID theAdamID)
var adam = new Adam(theAdamId, this)
Adam.Adam(AdamID theAdamID, God theGod)
_god = theGod
_mind = theGod.LoadMind(theAdamId, this)
Mind God.LoadMind (AdamID theAdamID, Adam theAdam)
var mind = new Mind (theAdam)
var mindId = new minId(theAdamId)
mind.DeserializeFromFile(minId)
Mind.Mind (Adam theAdam)
_adam = theAdam
Run Code Online (Sandbox Code Playgroud) 我有一个简单的代码:
define(['app'], function(app)
{
app.factory('factoryProvider', function(){
return {
name: 'my Name'
}
});
app.directive('myDiv',['factoryProvider', function(factoryProvider) {
return {
restrict: 'E',
replace: true,
templateUrl: 'link/to/template.html',
controller: function($scope) {
},
link: function(scope, routeParams, location) {
console.log(factoryProvider.name);
}
};
}])
});
Run Code Online (Sandbox Code Playgroud)
我希望能够myFactory在link函数内访问,但我不能!我也尝试过link: function(scope, routeParams, location, factoryProvider),但也没用.为什么?
我有一个users表和一个与businesses表一对一/一的关系(users.user_id => businesses.user_id).在我的users桌子上,我有一个鉴别器,它告诉我用户是否属于商业类型,因此我也需要在businesses表格上有详细信息.
我想用我目前正在工作的工厂创建我的用户,然后只创建业务详细信息,其中鉴别器指向企业帐户.
我脑子里有三个选择:
user_id用户分配给业务工厂. user_id已经创建的用户与业务工厂user_id. users.user_id和business.user_id.但是我使用的是随机生成器,user.user_type即使我businesses填充了表,也可能是那些将鉴别器设置为"个人"的用户.还有另外一种方法吗?我可以将Seeder的论据传递给工厂吗?
Factory_boy用于fake-factory (Faker)生成随机值,我想直接使用Faker在我的Django测试中生成一些随机值.
Factory_boy文档建议使用factory.Faker及其提供者:
class RandomUserFactory(factory.Factory):
class Meta:
model = models.User
first_name = factory.Faker('first_name')
Run Code Online (Sandbox Code Playgroud)
但这不会产生任何名称:
>>> import factory
>>> factory.Faker('name')
<factory.faker.Faker object at 0x7f1807bf5278>
>>> type(factory.Faker('name'))
<class 'factory.faker.Faker'>
Run Code Online (Sandbox Code Playgroud)
从factory_boy faker.py类factory.Faker('ean', length=10)调用,faker.Faker.ean(length=10)但Faker文档说它应该显示一个名称:
from faker import Faker
fake = Faker()
fake.name()
# 'Lucy Cechtelar'
Run Code Online (Sandbox Code Playgroud)
有没有其他方法可以使用Faker而不是直接设置实例Faker?
from faker import Factory
fake = Factory.create()
fake.name()
Run Code Online (Sandbox Code Playgroud) 我相信工厂方法设计模式适合我正在尝试做的事情,但我不确定给它有多少责任(它创建的子类的知识).在维基百科上使用工厂方法模式的例子描述了我几乎完全正确的情况:
public class ImageReaderFactory
{
public static ImageReader getImageReader( InputStream is )
{
int imageType = figureOutImageType( is );
switch( imageType )
{
case ImageReaderFactory.GIF:
return new GifReader( is );
case ImageReaderFactory.JPEG:
return new JpegReader( is );
// etc.
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,该figureOutImageType功能是什么样的?在这个具体的例子中,我假设它检查一个文件头InputStream以确定数据所在的图像格式.我想知道ImageReaderFactory它自己是否知道如何解析文件头并确定文件类型是否为GIF,JPEG等等,或者如果它调用每个Reader类中的一个函数,让它知道它是什么类型的图像.这样的事情,也许:
int figureOutImageType(InputStream is)
{
if(GifReader.isGIF(is))
return ImageReaderFactory.GIF;
else if(JpegReader.isJPEG(is))
return ImageReaderFactory.JPEG;
// etc.
}
Run Code Online (Sandbox Code Playgroud)
似乎让工厂知道如何解析图像破解封装,并让子类决定应该创建哪一个是工厂方法设计模式的一部分.然而,似乎figureOutImageType函数只是添加了一些冗余代码,因为为什么不让每个子类InputStream对getImageReader函数中的函数执行检查并跳过switch case?
我以前没有任何使用过工厂的经验,我希望从过去使用它们的一些人那里得到一些见解,以解决这个问题的最佳方法.是否可以让工厂了解其子类的内部工作原理,或者他们是否应该负责让工厂知道要创建哪个,以及如何组织它?
谢谢!
我有一个像工厂一样的对象方法.你给它一个类型,它创建一个实例并做一些其他的事情.一个优雅的方式(在我看来)是这样的:
public T MagicMethod<T>() where T: SomeBaseClass
{
// Magic goes here
}
Run Code Online (Sandbox Code Playgroud)
但是这让FxCop感到不安,他说这是一个糟糕的风格 - 我得到一个"CA1004:通用方法应该提供类型参数"警告.关于不使用推理和东西的事情.所以,我能想到的另一种方式是这样的:
public SomeBaseClass MagicMethod(Type T)
{
// Same magic goes here
}
Run Code Online (Sandbox Code Playgroud)
我认为这不如许多帐户的第一种方法,但风格规则......关于警告的MSDN文章甚至说没有理由压制它.
我是否通过抑制此警告来做到这一点?
在工厂模式中使用Reflection是一个好习惯吗?
public class MyObjectFactory{
private Party party;
public Party getObject(String fullyqualifiedPath)
{
Class c = Class.forName(fullyqualifiedPath);
party = (PersonalParty)c.newInstance();
return party;
}
}
Run Code Online (Sandbox Code Playgroud)
PersonalParty实施派对
我正在尝试将java.util.prefs.Preferences bean注入我的主控制器.控制器看起来像:
@Controller
class MyController {
@Autowired
private Preferences preferences;
}
Run Code Online (Sandbox Code Playgroud)
application-context.xml文件为java.util.prefs.Preferences创建bean.它使用工厂方法,所以我有以下条目来创建bean:
<bean id="preferences" class="java.util.prefs.Preferences" factory-method="userNodeForPackage" />
Run Code Online (Sandbox Code Playgroud)
Preferences.userNodeForPackage(param)为参数提供与Preference相关的类.在这种情况下,Spring需要通过执行调用来创建bean:
Preferences.userNodeForPackage(MyController.class);
Run Code Online (Sandbox Code Playgroud)
如何将类传递给使用工厂方法实例化的spring bean?谢谢
环境信息:
Java 7
Spring 3.1
Run Code Online (Sandbox Code Playgroud) factory ×10
c# ×2
java ×2
angularjs ×1
casting ×1
class ×1
factory-boy ×1
faker ×1
generics ×1
laravel ×1
oop ×1
parameters ×1
preferences ×1
python ×1
reflection ×1
ruby ×1
spring ×1
types ×1