我正在按照教程显示工厂模式以在javascript中创建对象.下面的代码让我难以理解它的工作原理.
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>6-2.htm</title>
</head>
<body>
<script type="text/javascript">
function createAddress(street, city, state, zip) {
var obj = new Object();
obj.street = street;
obj.city = city;
obj.state = state;
obj.zip = zip;
obj.showLabel = function() {
//alert(this.street + "\n" + this.city + ", " + this.state + " " + this.zip);
//var obj;
alert(obj.street + "\n" + obj.city + ", " + obj.state + " " + obj.zip);
};
return obj;
};
var JohnAddr = …Run Code Online (Sandbox Code Playgroud) 我的项目已包含一些处理程序的工厂(代码非常简化):
class HandlersFactory
{
private static readonly Dictionary<string, IHandler> registeredHandlers =
new Dictionary<string, IHandler>
{
{ "First", new FirstHandler() },
{ "Second", new SecondHandler() },
{ "Third", new ThirdHandler() },
};
public bool IsRegisteredHandler(string name)
{
return registeredHandlers.ContainsKey(name);
}
public IHandler GetHandler(string name)
{
if (!IsRegisteredHandler(name))
return null;
return registeredHandlers[name];
}
}
Run Code Online (Sandbox Code Playgroud)
处理程序列表是硬编码的.工厂位于主程序集中,但应用程序可以在运行时使用其他程序集进行扩展(主应用程序搜索它们并在开始时加载).附加组件定制应用程序
必须有可能从主程序集中"替换"一些处理程序(提供另一个逻辑).因此,例如,工厂将按CustomSecondHandler名称"Second" 返回,而不是SecondHandler在加载其他程序集时返回.我能够重写工厂,但更改不得影响已经使用它的代码.
我想过将字典初始化移动到RegisterHandlers可以在自定义工厂中重写的某些方法.并添加工厂的依赖注入,因此附加组件提供从现有工厂派生的工厂自己的实现.如果未加载其他程序集,则使用默认工厂.但我觉得这种方法有问题.
请提出你的想法.我需要一个干净的解决方案,只需要最少的代码编写,以提供将取代现有的自定义处理程序
谢谢.
我正在开发一个用GoLang编写的小型游戏/模拟器,其中可能有数百种能力.对于每个玩家,他们将拥有1到3个技能.我将这些存储与字符串或ID.实例化这些能力的最佳方法是什么.通常情况下,我会使用一个工厂级,但我说的多,我不确定这是最好的方法.
我想编写一个通用的构建器类,它包含任何 java 类并提供特定样式的 setter 函数。我不确定这是否可以称为“动态生成的函数”。
当我有一个豆豆 Pojo 类时,即
class Pojo {
public void setValue(int value) {...}
public void setName(String name) {...}
}
Run Code Online (Sandbox Code Playgroud)
我的Maker班级应该可以这样使用:
Pojo p = Builder<Pojo>.create(new Pojo())
.setName("Funny")
.setValue(123)
.build();
Run Code Online (Sandbox Code Playgroud)
如您所见,它所做的工作应该类似于
class PojoBuilder {
private Pojo pojo;
PojoBuilder(Pojo pojo) { this.pojo = pojo; }
public static PojoMaker create(Pojo p) { return new PojoBuilder(p); }
public PojoBuilder setName(String name) { pojo.setName(name); return this; }
public PojoBuilder setValue(int val) { pojo.setValue(val); return this; }
public Pojo make() …Run Code Online (Sandbox Code Playgroud) 我正在寻找许多方法来实现Java中的Factory模式,但仍然找不到一个完美的方法,如果/ switch plus不使用反射,则不会受到影响.我找到的最好的一个是Tom Hawtin在这里的答案:https://stackoverflow.com/a/3434505/1390874
但我最担心的是它将匿名类的HashMap存储在内存中.
问题是除了Tom Hawtin的答案之外,人们还会考虑使用Class.newInstance()吗?这样可以避免我们在内存中存储不必要的匿名类吗?加上代码会更干净.
它看起来像这样:
class MyFactory {
private static final Map<String,Class> factoryMap =
Collections.unmodifiableMap(new HashMap<String,Class>() {{
put("Meow", Cat.class);
put("Woof", Dog.class);
}});
public Animal createAnimal(String action) {
return (Animal) factoryMap.get(action).newInstance();
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个迷宫类,它有一个构造函数:
public class Maze implements MazeInterface {
private int width; // Width of maze in units
private int height; // Height of maze in units
private long seed; // Seed generated for the maze
private Cell[][] board; // 2D representation of the maze
public Maze(int w, int h, Cell[][] maze, long s){
width = w;
height = h;
board = maze;
seed = s;
}
// Bunch of other methods/stuff irrelevant
}
Run Code Online (Sandbox Code Playgroud)
我在网上阅读有关良好做法的信息,现在我明白复杂的构造函数是不好的做法。所以我认为工厂类将是一个可行的解决方案。我想要做的是为迷宫生成一个随机种子、随机 w/h 值(迷宫的宽度或高度有多少个单位),以及迷宫对象的其他逻辑。工厂模式是正确的方法吗?
public class MazeFactory {
public …Run Code Online (Sandbox Code Playgroud) 我一直试图解决这个问题
http://symfony.com/doc/current/service_container/factories.html
但是似乎有一块缺失让所有人都厌倦了或者我完全忽略了这一点.
该示例具有工厂类
class NewsletterManagerFactory
{
public static function createNewsletterManager()
{
$newsletterManager = new NewsletterManager();
// ...
return $newsletterManager;
}
}
Run Code Online (Sandbox Code Playgroud)
然后通过服务将该工厂配置为工厂类和NewsletterManager服务方法.
services:
app.newsletter_manager_factory:
class: AppBundle\Email\NewsletterManagerFactory
app.newsletter_manager:
class: AppBundle\Email\NewsletterManager
factory: 'app.newsletter_manager_factory:createNewsletterManager'
Run Code Online (Sandbox Code Playgroud)
所以现在我们有一个通过param NewsletterManager知道NewsletterManagerFactoryClass的Classfactory:services.yml
题
你如何利用这种配置?现在暴露在内的NewsletterManager是什么让我可以createNewsletterManager在工厂上课?
据我所知,这两项服务仍然是完全分开的?
我一直在研究基于 PHP 中 Laravel 框架的 API,但这不是特定于该语言的。API 中使用了许多第三方 API,并且有许多多种配置。所以我想创建一个 HTTP 客户端工厂类,在代码中,我打算为此创建一个对象并将 API 名称作为参数传递。主要问题是如何根据特定 API 的名称将其解析为各种类?那就是当我给谷歌时,它需要初始化谷歌类并返回谷歌API客户端,对于其他API,它应该用相应的客户端响应。
我有一个困惑,比如这是工厂模式的正确用例,如果不是,是否有任何其他模式或标准方法可以做到这一点,而不是分别调用每个 API 客户端。?
在 Magento 2 中,什么是工厂模式并用于?我是 magento 的新手,所以请您详细解释一下。