Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 工厂设计模式和关键字';新';_Oop_Design Patterns - Fatal编程技术网

Oop 工厂设计模式和关键字';新';

Oop 工厂设计模式和关键字';新';,oop,design-patterns,Oop,Design Patterns,我是一名初级程序员。我知道OOP的基础知识,但我还不知道“最佳实践”。例如,编程中不断出现的一种范式是“抽象工厂”设计模式,它看起来相当简单。它背后的一个关键意图是避免使用关键字“new”,因为它被认为是有害的。在我学习编程的课程中,我从来没有听说过这一点。有人能详细说明这一点吗?为什么我们要避免在此表单中实例化对象?在您编写的客户机/调用方类中考虑: Vehicle v = new Car("BMW"); 如果您的代码与上面的代码类似,您将始终获得一辆汽车。将来,如果你真的想要一架飞机,你必

我是一名初级程序员。我知道OOP的基础知识,但我还不知道“最佳实践”。例如,编程中不断出现的一种范式是“抽象工厂”设计模式,它看起来相当简单。它背后的一个关键意图是避免使用关键字“new”,因为它被认为是有害的。在我学习编程的课程中,我从来没有听说过这一点。有人能详细说明这一点吗?为什么我们要避免在此表单中实例化对象?

在您编写的客户机/调用方类中考虑:

Vehicle v = new Car("BMW");
如果您的代码与上面的代码类似,您将始终获得一辆汽车。将来,如果你真的想要一架飞机,你必须更新客户端代码

或者,使用工厂模式,您可以编写如下代码:

Vehicle v = Factory.getVehicle();

现在,您可以保持车辆远离客户(松耦合)的逻辑,并且您的客户永远不需要更改,以防您必须更新您得到的最终车辆。只有工厂实现将更新,您的客户端将按原样工作。

据我所知,new关键字没有任何问题。 我说的是PHP开发人员。new关键字没有问题,也没有安全问题

PHP中的工厂模式用于自动请求、生成类的实例并返回该类。这并不是因为new关键字有问题,而是因为运行一个静态函数要比为您需要的每个对象使用new关键字快得多

在后台,您无论如何都会使用new关键字:)


因此,新产品没有问题,也没有必要避免。与工厂模式相比,获得类实例的速度要快得多,然后需要类,然后用new关键字将其实例化。

我不想说新的
被认为是有害的。抽象工厂模式试图解决
new
不可重写的问题(即与虚拟分派不兼容,至少在Java和C#等语言中是如此)

考虑以下示例代码(C#):

在这段代码中,我们有一个基本接口
ISendChannel
,允许与某个端点进行前向通信。但是,给定的实现是固定的,无论发生什么情况,都始终使用TCP通道。这是不可取的,因为现在如果需要HTTP发送方,您必须修改
发送方
类或向其添加新方法。这是“不良耦合”

相反,您可以使用工厂创建频道并将其传递给发送方。发送方将要求工厂创建频道,从而放弃该责任。新的实现可能如下所示:

class Sender
{
    private readonly ISendChannelFactory factory;
    private ISendChannel channel;

    public Sender(ISendChannelFactory factory)
    {
        this.factory = factory;
    }

    public void Connect(Uri endpointAddress)
    {
        // Sender does not have to care what type of channel it is.
        this.channel = this.factory.CreateSendChannel(endpointAddress);
    }

    /* ... */
}

现在要使用HTTP通道,可以使用不同的工厂类型实例化发送方,例如
newsender(new-HttpSendChannelFactory(/*…*/)
HttpSendChannelFactory
然后可以从其
CreateSendChannel
方法返回
HttpSendChannel
(一个从
ISendChannel
派生的具体类型)。

抽象工厂模式的思想是不了解任何具体实现,包括构造函数

因此,标准工厂模式将返回一个具体的类,例如

SomeType SomeVar=SomeFactory.CreateSomeType()

抽象工厂模式应该在哪里

SomeInterface SomeVar=AbstractFactory.CreateSomeInterface()


因此,与向使用者公开某种类型不同,只有接口是。只是一个更高层次的抽象,这是非常有用的,但只有当你不想让工厂消费者知道某个类型时才是有害的。

要理解这个模式或者使用
new
关键字有什么错,你缺少一个基本的先决条件编程范例,这就是


研究这一点,一旦你理解了它是什么,你就会明白,真正实施/遵循它的唯一方法是避免在代码中使用
new
,即在代码中明确实例化具体对象,这会产生代码耦合的恶劣影响。

我建议阅读本文:

关键部分是:学习编写简单代码的最好方法是编写简单代码!模式,就像所有形式的复杂性一样,应该避免,直到它们是绝对必要的。这是初学者需要学习的第一件事。不是最后一件事

我同意——只有当你真正需要工厂时,你才需要它

好,回到主题,关键字
new
可能是邪恶的,但在大多数情况下,它肯定不是,也不应该是头痛的根源。看见

List <Person> persons = new ArrayList<Person>();
List persons=new ArrayList();
很好。甚至不敢考虑工厂生产
ArrayList
LinkedList
。那完全是过度设计的

“我见过许多系统过度使用工厂模式。例如,如果系统中的每个对象都是使用工厂创建的,而不是直接实例化(例如,新的StringNode)(ノ)),这个系统可能有过多的工厂。”@Joshua Kerievsky

不要过早地添加模式,除非你确信这是一个好主意,如果没有足够的经验,你就无法确定这一点。开始编写代码时,你脑海中的模式有点像:工厂,这很好,让我看看什么时候可以放置它!-这不是一个好主意:)。如果您觉得(气味:)-代码气味)可以做得更好,那么最好在代码中麻烦的地方添加模式。这就是重构到模式

有一本关于它的好书,我会给你一个链接到“将创造知识转移到工厂”


我知道它很长,但请读一读,它确实值得付出努力

这不是一个速度问题,而是一个关于松散的co的问题
List <Person> persons = new ArrayList<Person>();