请问工厂方法模式(不要与工厂或抽象工厂模式混淆)违反了开/关的原则?
更新:为了澄清,我指的是具体类具有静态工厂方法的场景.例如(这是来自FMP上的维基百科页面):
class Complex
{
public static Complex fromCartesian(double real, double imag) {
return new Complex(real, imag);
}
public static Complex fromPolar(double modulus, double angle) {
return new Complex(modulus * cos(angle), modulus * sin(angle));
}
private Complex(double a, double b) {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
私有构造函数不会阻止类被子类化,即扩展吗?
是否必须修改类以支持新的工厂方法?例如,如果该类最初只有来自Caresian,后来需要来自thePolar,那么是否必须修改该类才能支持此类?
这两个都不违反开放/封闭吗?
该飞镖风格指南建议使用构造函数,而不是静态方法来创建实例,因为" 命名的构造函数和工厂构造函数中达特给你所有的其他语言的静态方法的灵活性,同时仍然允许调用点显得像一个普通的构造函数调用 ".
那么是否存在技术原因,因为已经声明int.parse()并且double.parse()是静态方法而不是工厂构造函数?
更一般地说,选择在Dart中通过静态(工厂)方法编写工厂构造函数的指导原则是什么?
来自GOF书:
类模式处理类及其子类之间的关系.这些关系是通过继承建立的,因此它们在编译时是静态修复的.对象模式 处理对象关系,可以在运行时更改它们并且更加动态.几乎所有模式都在某种程度上使用继承.所以标记为"类模式"的唯一模式是那些关注类关系的模式.
为什么工厂方法是一个类模式,而抽象工厂是一个对象模式,因为它们似乎是非常相似的模式?
谢谢.
这是我的代码。编译时出现错误
\n\n\n\n\n\xe2\x80\x98geometry\xe2\x80\x99 之前的声明符无效
\n
在第 16 行和第 48 行,我不确定我做错了什么。请指教。
\n\n#include <iostream>\n#include <memory>\n#include <vector>\nusing namespace std;\nclass FactGeometry { //Factory class\npublic:\n static std::shared_ptr<FactGeometry>geometry( int choice );\n virtual void calcArea() = 0;\n};\n\nclass CalcRectangle :public FactGeometry {\n void calcArea() {\n double ll, bb, Area;\n std::cout << "\\nEnter the length = ";\n std::cin >> ll;\n std::cout << "\\nEnter the breadth = ";\n std::cin >> bb;\n Area = ll * bb;\n std::cout << "\\nArea = " << Area;\n }\n}; //end class\n\nclass CalcTraingle …Run Code Online (Sandbox Code Playgroud) 我在嵌入式环境(Arduino/AVR ATMega328)中工作,并希望在C++中实现Factory Method模式.但是,我正在使用的编译器(avr-gcc)不支持该new关键字.有没有办法在不使用的情况下实现这种模式new?
据我所知,工厂方法是简单工厂,工厂对象是抽象工厂?和:
- 工厂方法(简单工厂):
public class SimplePizzaFactory {
public static final int CHEESE = 1;
public static final int PEPPERONI = 2;
public static final int VEGGIE = 3;
public static Pizza createPizza(int type) {
Pizza pizza = null;
if (type == CHEESE) {
pizza = new CheesePizza();
} else if (type == PEPPERONI ) {
pizza = new PepperoniPizza();
} else if (type == VEGGIE ) {
pizza = new VeggiePizza();
}
return pizza;
}
}
Run Code Online (Sandbox Code Playgroud)
工厂对象(抽象工厂):
?
我对吗?
工厂模式的实现有多少,它们的区别是什么?
我知道工厂方法是一个类方法,它利用self关键字并实例化它自己的类的对象.我不明白这是如何有用的,或者它如何扩展initialize方法的功能.
我正在创建一个创建命令行地址簿的项目,要求我在Person类上使用工厂模式,这样我就可以创建具有不同属性的Trainee或Instructor(子类).
前言 - 我在 SO 上看过与此类似的帖子,但答案似乎不适用。
我有一个具有以下方法的抽象类(简化):
playAnimation() {
let animator = this.createAnimator(this.animatorData)
await animator.animate()
}
Run Code Online (Sandbox Code Playgroud)
Create animator 在该抽象类中有以下定义:
abstract createAnimator(animatorData: Object): Animator
Run Code Online (Sandbox Code Playgroud)
子类可能会createAnimator这样实现:
createAnimator(animatorData: StandardAnimatorData) {
return new RiverAnimator(animatorData.addMessage, animatorData.assetsDir)
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
createAnimator(animatorData: StandardAnimatorData) {
return new BridgeAnimator(animatorData.addMessage, animatorData.assetsDir)
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的 - 两个子类的实现createAnimator大致相同,除了返回的类型之外Animator。
SidenoteBridgeAnimator和RiverAnimator两者都实现了Animator接口,但如果解决方案需要Animator是一个抽象类,我可以更改它。
有没有办法进入createAnimator抽象基类?
理想情况下,抽象类应该有一个抽象变量,它是应该返回的类的类型createAnimator。子类只会实现该变量。然后createAnimator使用该变量返回正确的类型Animator。
Java 9提供Map.of()了轻松创建具有固定值的地图的功能.
问题:我想创建一个保留插入顺序的地图LinkedHashMap.这个工厂有可能吗?至少map.of()不保存订单......
我有以下界面和实现:
public interface IRepository<T>
{
IList<T> GetAll();
}
internal class TrendDataRepository : IRepository<TrendData>
{
public IList<TrendData> GetAll()
{
//.. returns some specific data via Entity framework
}
}
Run Code Online (Sandbox Code Playgroud)
我将要有多个实现,它们都通过Entity Framework返回不同的数据.在某些时候,我想向用户表示实现IRepository接口的类列表.我使用以下代码执行此操作.这对我很有用.
public static IEnumerable<string> GetAvailableRepositoryClasses()
{
var repositories = from t in Assembly.GetExecutingAssembly().GetTypes()
where t.GetInterfaces().Any(x => x.IsGenericType && x.GetGenericTypeDefinition() == typeof (IRepository<>))
select t.Name;
return repositories;
}
Run Code Online (Sandbox Code Playgroud)
但是,我还想创建一个工厂方法,给定一个特定的字符串将返回一个具体的存储库类型,并允许我在其上调用'GetAll'方法.在伪代码中:
someObject = Factory.CreateInstance("TrendData");
someObject.GetAll();
Run Code Online (Sandbox Code Playgroud)
(我知道这不起作用,因为我必须在工厂方法中指定具体类型).
我希望这个功能,因为我想让用户能够将报告绑定到特定的数据源.通过这种方式,他们可以启动一个新报告,其中报告的数据源绑定到(例如)TrendDataRepository.GetAll()方法.
然而,也许是因为世界末日即将来临;-)或者是星期五下午我不能再思考了,我不知道如何实现这一点.
一些指针真的很受欢迎.
factory-method ×10
factory ×2
java ×2
abstract ×1
avr ×1
avr-gcc ×1
c# ×1
c++ ×1
c++11 ×1
class ×1
constructor ×1
dart ×1
embedded ×1
generics ×1
hashmap ×1
java-9 ×1
make-shared ×1
oop ×1
ruby ×1
shared-ptr ×1
typescript ×1