我有一堂课Foo
class Foo;
Run Code Online (Sandbox Code Playgroud)
工厂返回指针:
std::unique_ptr<Foo> createFoo();
Run Code Online (Sandbox Code Playgroud)
因为Herb告诉我,在Foo的一生中没有特别要求的普通函数应该采用简单的指针:
void plainf(Foo* f);
Run Code Online (Sandbox Code Playgroud)
我的客户应该如何正确地做到这一点?
plainF(createFoo());
Run Code Online (Sandbox Code Playgroud)
如果他不得不写,他会不高兴:
auto someName = createFoo();
plainF(someName.get());
Run Code Online (Sandbox Code Playgroud) 我目前正在用Python实现Factory设计模式,我有几个问题.
有没有办法阻止实际具体类的直接实例化?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck().我可以在init()中抛出异常,但这也意味着工厂无法创建它的实例......
在我看来,工厂正在上瘾.似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变.我很想知道什么时候有实际需要使用工厂,什么时候不适合使用.例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西).在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?
我只是想知道是否有通常的方式来调用工厂.例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...).我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现.
编辑:我所说的"暴露实施"是因为它让人们知道它是一个工厂.我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?).我知道这些代码很容易暴露,所以我并不是说"暴露源代码中实现功能的方式".
谢谢!
我想通过提供一个调用用户功能的界面,为我的一个模块的用户提供扩展功能的能力.例如,我想让用户在创建类的实例时获得通知的能力,并且在使用它之前有机会修改实例.
我实现它的方法是声明一个模块级工厂函数来进行实例化:
# in mymodule.py
def factory(cls, *args, **kwargs):
return cls(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
然后,当我需要mymodule中的一个类的实例时,我会factory(cls, arg1, arg2)而不是cls(arg1, arg2).
为了扩展它,程序员会在另一个模块中写一个这样的函数:
def myFactory(cls, *args, **kwargs):
instance = myFactory.chain(cls, *args, **kwargs)
# do something with the instance here if desired
return instance
Run Code Online (Sandbox Code Playgroud)
上面回调的安装如下所示:
myFactory.chain, mymodule.factory = mymodule.factory, myFactory
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎很简单,但我想知道,作为一名Python程序员,你是否期望一个函数能够注册一个回调而不是一个赋值,或者你是否还有其他方法.我的解决方案对您来说是否可行,惯用且清晰?
我希望尽可能保持简单; 我不认为大多数应用程序实际上需要链接多个用户回调,例如(尽管使用上述模式无限链接"免费").我怀疑他们需要删除回调或指定优先级或订单.像python-callbacks或PyDispatcher这样的模块在我看来就像矫枉过正,尤其是后者,但如果对使用我的模块的程序员有很大的好处,我会向他们开放.
我正在阅读Effective JavaJoshua Bloch,我对Item1有疑问Static Factory Method.
引用[布洛赫,第7页]
接口不能使用静态方法,因此按照惯例,名为Type的接口的静态工厂方法放在名为Types的不可实例化的类中.例如,Java Collections Framework提供不可修改的集合,同步集合等.几乎所有这些实现都是通过一个不可实例化的类(java.util.Collections)中的静态工厂方法导出的.返回对象的类都是非公共的.
好.查看源代码时,我看到带有私有构造函数的java.util.Collection接口和java.util.Collections类(不可实例化的类).而且我看到不可实例化的类Collections具有所有静态方法,就像Bloch所说的那样.但布洛赫说,我没有看到两个班级之间的联系
接口不能使用静态方法,因此按照惯例,名为Type的接口的静态工厂方法放在名为Types的不可实例化的类中.
任何人都可以向我指出明显的事吗?
什么是他说的意思
返回对象的类都是非公共的
这是我获取java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f
我试图使用表视图来呈现/编辑"key = value"对.因此该表应该有两列:"key"和"value".Key只是一个普通的字符串,值可以是任何值.我的问题是值的数据类型可能因行而异.基本上,我想使用复选框作为布尔值和列表选项.我找到了一种方法,通过设置单元格工厂,使用复选框或选项呈现整个表列:
final TableColumn<FieldValue, Field> valueColumn = new TableColumn<>("Value");
valueColumn.setCellFactory(new Callback<TableColumn<FieldValue, Field>, TableCell<FieldValue, Field>>() {
@Override
public TableCell<FieldValue, Field> call(final TableColumn<FieldValue, Field> column) {
// if (value instanceof Boolean)
return new CheckBoxTableCell<>();
}
});
Run Code Online (Sandbox Code Playgroud)
但我需要的是能够根据将要在单元格内呈现的项目类型插入条件.换句话说,某些单元工厂位于单元级别而不是列级别.这会在渲染时评估我的状况.我还没有找到任何解决方案.也许有人有一些适当的技术来实现这种渲染?也许有些第三方数据网格?
我正在为我的公司开发一个内部项目,项目的一部分是能够将XML文件中的各种"任务"解析为稍后要运行的任务集合.
因为每种类型的Task都有许多不同的相关字段,所以我认为最好用一个单独的类来表示每种类型的Task.
为此,我构建了一个抽象基类:
public abstract class Task
{
public enum TaskType
{
// Types of Tasks
}
public abstract TaskType Type
{
get;
}
public abstract LoadFromXml(XmlElement task);
public abstract XmlElement CreateXml(XmlDocument currentDoc);
}
Run Code Online (Sandbox Code Playgroud)
每个任务都继承自此基类,并包含从传入的XmlElement创建自身所需的代码,以及将自身序列化为XmlElement.
一个基本的例子:
public class MergeTask : Task
{
public override TaskType Type
{
get { return TaskType.Merge; }
}
// Lots of Properties / Methods for this Task
public MergeTask (XmlElement elem)
{
this.LoadFromXml(elem);
}
public override LoadFromXml(XmlElement task)
{
// Populates this Task from the …Run Code Online (Sandbox Code Playgroud) 我在rails应用程序中使用factory_girl插件.对于每个模型,我有一个包含工厂数据的相应ruby文件,例如
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
# t.user ???
end
Run Code Online (Sandbox Code Playgroud)
我有很多不同类型的用户(已在用户工厂中定义).如果我尝试以下方法:
Factory.define :valid_thing, :class => Thing do |t|
t.name 'Some valid thing'
t.user Factory(:valid_user) # Fails
end
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
# No such factory: valid_user (ArgumentError)
Run Code Online (Sandbox Code Playgroud)
:valid_user实际上是有效的 - 我可以在我的测试中使用它 - 只是不在我的工厂中.有什么方法可以在这里使用另一个文件中定义的工厂吗?
这是我得到的:
public class Node<T> {
// instance variables
private Node<T> next;
private T data;
// construct with data
private Node(T data){
next = null;
this.data = data;
}
// construct without data
private Node(){
next = null;
this.data = null;
}
// static factory method
public static <T> Node<T> newNodeWithData(T data){
return new Node<T>(data);
}
// static factory method
public static <T> Node<T> newNode(){
return new Node<T>();
}
...
}
Run Code Online (Sandbox Code Playgroud)
我的问题实际上只是泛型的语法加上静态工厂方法的语法.我真的不明白为什么我们在方法声明中将<T>放在返回类型之前.有点像类型转换吗?任何帮助将非常感激!
我正在寻找一个如何实现工厂类的简单示例,但不使用Switch或If-Then语句.我能找到的所有例子都使用一个.例如,如何修改这个简单示例(如下所示),以便实际工厂不依赖于Switch?在我看来,这个例子违反了开/关原则.我希望能够添加具体的类('经理','文员','程序员'等),而无需修改工厂类.
谢谢!
class Program
{
abstract class Position
{
public abstract string Title { get; }
}
class Manager : Position
{
public override string Title
{
get { return "Manager"; }
}
}
class Clerk : Position
{
public override string Title
{
get { return "Clerk"; }
}
}
class Programmer : Position
{
public override string Title
{
get { return "Programmer"; }
}
}
static class Factory
{
public static Position Get(int id)
{ …Run Code Online (Sandbox Code Playgroud) 我想使用DataGrid.CanUserAddRows = true功能.不幸的是,它似乎只适用于具有默认构造函数的具体类.我的业务对象集合不提供默认构造函数.
我正在寻找一种方法来注册一个知道如何为DataGrid创建对象的工厂.我看了一下DataGrid和ListCollectionView,但它们似乎都不支持我的场景.