标签: factory

工厂:如何将临时智能指针传递给函数.C++

我有一堂课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)

c++ factory smart-pointers temporary

23
推荐指数
2
解决办法
2011
查看次数

Python中的工厂模式

我目前正在用Python实现Factory设计模式,我有几个问题.

  1. 有没有办法阻止实际具体类的直接实例化?例如,如果我有一个生成Vehicle的VehicleFactory,我希望用户只使用该工厂,并防止任何人直接意外地实例化Car()或Truck().我可以在init()中抛出异常,但这也意味着工厂无法创建它的实例......

  2. 在我看来,工厂正在上瘾.似乎所有东西都应该成为工厂,这样当我改变内部实现时,客户端代码不会改变.我很想知道什么时候有实际需要使用工厂,什么时候不适合使用.例如,我可能有一个Window类,现在只有这种类型的一个(没有PlasticWindow,ReinforcedWindow或类似的东西).在这种情况下,我是否应该使用工厂为客户端生成Window,以防万一我以后可能会添加更多类型的Windows?

  3. 我只是想知道是否有通常的方式来调用工厂.例如,现在我将我的车辆工厂称为车辆,因此代码将类似于Vehicles.create(...).我看到很多教程就像VehicleFactory一样,但我发现它太长了,它也暴露了实现.

编辑:我所说的"暴露实施"是因为它让人们知道它是一个工厂.我觉得客户不需要知道它是一个工厂,而是作为一个可以为你返回对象的类(当然这是一个工厂,但也许没有必要明确告诉客户那个?).我知道这些代码很容易暴露,所以我并不是说"暴露源代码中实现功能的方式".

谢谢!

python design-patterns factory factory-pattern

22
推荐指数
3
解决办法
2万
查看次数

在Python中实现钩子或回调的首选方法是什么?

我想通过提供一个调用用户功能的界面,为我的一个模块的用户提供扩展功能的能力.例如,我想让用户在创建类的实例时获得通知的能力,并且在使用它之前有机会修改实例.

我实现它的方法是声明一个模块级工厂函数来进行实例化:

# 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-callbacksPyDispatcher这样的模块在我看来就像矫枉过正,尤其是后者,但如果对使用我的模块的程序员有很大的好处,我会向他们开放.

python hook factory callback

22
推荐指数
3
解决办法
1万
查看次数

有效的Java作者:Joshua Bloch:第1项 - 静态工厂方法

我正在阅读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的不可实例化的类中.

  1. 任何人都可以向我指出明显的事吗?

  2. 什么是他说的意思

返回对象的类都是非公共的

这是我获取java源代码的地方:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Collection.java?av = f

java design-patterns factory effective-java

22
推荐指数
1
解决办法
1万
查看次数

JavaFX 2 TableView:不同的单元工厂,取决于单元格内的数据

我试图使用表视图来呈现/编辑"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)

但我需要的是能够根据将要在单元格内呈现的项目类型插入条件.换句话说,某些单元工厂位于单元级别而不是列级别.这会在渲染时评估我的状况.我还没有找到任何解决方案.也许有人有一些适当的技术来实现这种渲染?也许有些第三方数据网格?

factory javafx cell tableview

22
推荐指数
1
解决办法
2万
查看次数

抽象工厂设计模式

我正在为我的公司开发一个内部项目,项目的一部分是能够将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)

c# design-patterns factory

21
推荐指数
2
解决办法
4801
查看次数

访问*其他*工厂中的factory_girl工厂

我在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实际上是有效的 - 我可以在我的测试中使用它 - 只是不在我的工厂中.有什么方法可以在这里使用另一个文件中定义的工厂吗?

tdd factory ruby-on-rails factory-bot

20
推荐指数
2
解决办法
6319
查看次数

Java泛型和静态工厂方法 - 语法

这是我得到的:

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>放在返回类型之前.有点像类型转换吗?任何帮助将非常感激!

java generics syntax static factory

20
推荐指数
3
解决办法
1万
查看次数

没有开关或If/Then的工厂模式

我正在寻找一个如何实现工厂类的简单示例,但使用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)

c# factory factory-pattern

20
推荐指数
2
解决办法
1万
查看次数

如何使用DataGrid.CanUserAddRows = true的工厂

我想使用DataGrid.CanUserAddRows = true功能.不幸的是,它似乎只适用于具有默认构造函数的具体类.我的业务对象集合不提供默认构造函数.

我正在寻找一种方法来注册一个知道如何为DataGrid创建对象的工厂.我看了一下DataGrid和ListCollectionView,但它们似乎都不支持我的场景.

data-binding wpf datagrid factory wpfdatagrid

19
推荐指数
3
解决办法
4976
查看次数