例如,我可以做类似的事情:
switch (myString)
case "rectangle":
o = new rect();
break;
case "ellipse"
etc...
Run Code Online (Sandbox Code Playgroud)
但是我怎么不做上面的事情,即只有一行代码直接从字符串中获取对象.想象一下,例如,一个按钮以及用户点击它时所说的任何内容,它会显示所显示的文本并从中创建一个对象.
我正在研究一个C#项目.我正在试图摆脱具有大switch声明的Factory类.
我想配置Autofac以便能够基于参数构造依赖关系,从而允许Autofac取代Factory.
我查看了Autofac wiki的DelegateFactories页面,但我无法弄清楚如何将模式应用于抽象类.以下是一些显示情况的代码:
public enum WidgetType
{
Sprocket,
Whizbang
}
public class SprocketWidget : Widget
{
}
public class WhizbangWidget : Widget
{
}
public abstract class Widget
{
public delegate Widget Factory(WidgetType widgetType);
}
public class WidgetWrangler
{
public Widget Widget { get; private set; }
public WidgetWrangler(IComponentContext context, WidgetType widgetType)
{
var widgetFactory = context.Resolve<Widget.Factory>();
Widget = widgetFactory(widgetType);
}
}
Run Code Online (Sandbox Code Playgroud)
我想要它,如果我要说new WidgetWrangler(context, WidgetType.Sprocket),它的Widget财产将是一个SpocketWidget.
当我尝试这个时,我得到的错误表明Widget.Factory …
我看到的多态方法覆盖的唯一例子涉及不带参数的方法,或者至少具有相同的参数列表.考虑常见的Animal/Dog/Cat示例:
public abstract class Animal
{
public abstract void makeSound();
}
public class Dog extends Animal
{
public void makeSound()
{
System.out.println("woof");
}
}
public class Cat extends Animal
{
public void makeSound()
{
System.out.println("meow");
}
}
public class ListenToAnimals
{
public static void main(String[] args)
{
AnimalFactory factory = new AnimalFactory();
Animal a = factory.getRandomAnimal(); // generate a dog or cat at random
a.makeSound();
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,一切都很好.现在让我们添加另一个在抽象类中部分实现的方法,同时在子类中获得更具体的行为:
public abstract class Animal
{
public abstract void makeSound();
public void speak(String …Run Code Online (Sandbox Code Playgroud) 我想编写一个实例化实例化具体类并将其接口返回给客户端的工厂.通过这种方式,我可以将客户端与直接依赖于具体类相分离.但是,与此同时,我并不希望工厂对具体课程有所依赖.我可以使用Reflection来满足我的需要,但在此之前我想知道这是否是一个好习惯.
我只是想知道这是否是在PHP中创建对象和实现工厂模式的正确方法.我知道我们有工厂方法模式和抽象工厂模式,但是我们有一个类似下面的模式 http://noondreams.com/shared/data/pages/images/Factory.png吗?
class Factory
{
public function make($format)
{
switch($format)
{
case Source::Assocs:
return new \Source\Formats\Assocs();
case Source::XML
return new \Source\Formats\XML();
//Some other formats
}
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在角度控制器之间共享一个id
我创建了如下服务:
app.factory("idService", function() {
var id;
addId = function(id) {
id = id;
};
getId = function() {
return id;
};
});
Run Code Online (Sandbox Code Playgroud)
在我的控制器中,我试图使用此服务如下:
app.controller('photoFormController', ['$scope', '$http', 'idService' , function($scope, $http, idService) {
$scope.id = idService.getId();
}]);
Run Code Online (Sandbox Code Playgroud)
我收到一个错误,无法调用未定义的方法,显然我注入了错误的服务.有人可以帮忙吗?
编辑:
根据下面的解决方案,该服务不再生成错误,但是我无法恢复id变量,我可以看到它是从一个控制器设置的,但在检索时它仍未定义:
app.factory("idService", function() {
var id;
addId = function(id) {
id = id;
console.log("added id of: " + id);
};
getId = function() {
console.log("trying to return : " + id);
return id;
};
return {
addId: addId,
getId: getId
}; …Run Code Online (Sandbox Code Playgroud) 我的socialRegisterFactory.pages工厂中设置了一个变量,一旦FaceBook的信息完全加载就会更新.我正在尝试在我的控制器中观察这个变量,以便在加载信息时以及当该变量从false变为true时,watch函数会相应地更新范围.我已经在控制器中注销了工厂的变量,它确实显示正确,但范围没有正确更新.我的$ watch功能有问题吗?
我的控制器:
$scope.pagesLoaded = false;
$scope.$watch(socialRegisterFactory.pages, function(newVal, oldVal){
if (socialRegisterFactory.pages === true) {
alert("true!");
$scope.pagesLoaded = true;
}
}, true);
Run Code Online (Sandbox Code Playgroud)
我的工厂:
var socialRegisterFactory ={
pages: false,
getAvailablePages: function($scope){
return $http.get(settings.urlBase+'social/facebook/pages')
.then(function(resp) {
socialRegisterFactory.pages = true;
angular.copy(resp.data.data, socialRegisterFactory.fbPages);
//$scope.fbPages = socialRegisterFactory.fbPages;
return socialRegisterFactory.fbPages;
});
},
Run Code Online (Sandbox Code Playgroud) 我正在使用django 1.6和factory-boy。
class UserFactory(factory.Factory):
class Meta:
model = models.User
username = factory.Sequence(lambda n: 'user%d' % n)
Run Code Online (Sandbox Code Playgroud)
这username是一个简单CharField的模型。这样,每次调用时,UserFactory()我都会保存并获取唯一的用户命名对象。
在工厂男孩中,我可以使用factory.SubFactory(SomeFactory)。
我如何生成SomeFactoryin的列表ParentOfSomeFactory?
这样,如果我打电话,ParentOfSomeFactory()我将创建SomeFactory以及ParentOfSomeFactory数据库的列表
在Java 9中,我们有方便工厂方法来创建和实例化不可变的List,Set和Map.
但是,目前还不清楚返回对象的具体类型.
例如:
List list = List.of("item1", "item2", "item3");
Run Code Online (Sandbox Code Playgroud)
在这种情况下,实际返回了哪种类型的列表?它是ArrayList或LinkedList还是其他类型的List?
API文档刚提到这一行,没有明确提到它的LinkedList:
列表中元素的顺序与提供的参数的顺序或提供的数组中的元素的顺序相同.
我试图了解这种JavaScript模式是如何工作的,它是用括号括起来的整个库。我的理解是,括号是确定变量范围的一种方法,但是内部是一个采用参数(全局,工厂)的函数。
我尝试搜索此模式的工作原理,但找不到任何东西。
代码体返回一个可以在其他地方使用的对象,但是我不明白参数的目的global和factory完成的目的。
我一直在阅读有关附件和匿名函数的信息,但是找不到关于这样定义的附件的任何信息。
(function (global, factory) {
global.className = factory();
} (this, function () {
ObjectName.prototype = function() {
/* some code */
}
var data = {
getUsefulData: function(obj) {
return new ObjectName(obj, 'usefuldata');
}
}
return data;
})
);
Run Code Online (Sandbox Code Playgroud)
问题:
factory ×10
c# ×3
angularjs ×2
java ×2
autofac ×1
collections ×1
controller ×1
delegates ×1
django ×1
factory-boy ×1
java-9 ×1
javascript ×1
literals ×1
oop ×1
parameters ×1
php ×1
polymorphism ×1
service ×1
watch ×1