我知道有很多关于这两种模式之间差异的帖子,但有一些我找不到的东西.
从我一直在阅读的内容中,我看到工厂方法模式允许您定义如何创建单个具体产品,但是从客户端隐藏实现,因为他们将看到通用产品.我的第一个问题是抽象工厂.它的作用是允许您创建具体对象的族(可能取决于您使用的特定工厂)而不仅仅是单个具体对象?抽象工厂是否只返回一个非常大的对象或许多对象,具体取决于您调用的方法?
我的最后两个问题是关于我在很多地方看到过的单一引言,我无法完全理解:
两者之间的一个区别是,使用抽象工厂模式,类通过组合将对象实例化的责任委托给另一个对象,而工厂方法模式使用继承并依赖子类来处理所需的对象实例化.
我的理解是工厂方法模式有一个Creator接口,它将使ConcreteCreator负责知道要实例化的ConcreteProduct.这是通过使用继承来处理对象实例化的意思吗?
现在关于那个引用,抽象工厂模式究竟是如何通过合成将对象实例化的责任委托给另一个对象?这是什么意思?看起来抽象工厂模式也使用继承来完成构建过程,但是我仍然在学习这些模式.
任何帮助,尤其是最后一个问题,将不胜感激.
design-patterns factory-method factory-pattern abstract-factory
请参阅System.Array类的定义
public abstract class Array : IList, ...
Run Code Online (Sandbox Code Playgroud)
从理论上讲,我应该能够写下这一点,并感到高兴
int[] list = new int[] {};
IList iList = (IList)list;
Run Code Online (Sandbox Code Playgroud)
我也应该可以从iList中调用任何方法
ilist.Add(1); //exception here
Run Code Online (Sandbox Code Playgroud)
我的问题不是为什么我得到一个例外,而是为什么Array实现了IList?
Liskov替换原则规定子类型应该可替代该类型(不改变程序的正确性).
我已经读过关于方形/矩形的例子,但我认为车辆的一个例子可以让我更好地理解这个概念.
我正在尝试找出设计一个其属性保存在数据库中的类的最佳方法.我们来看一个基本的例子Person.要创建一个新人并将其放在数据库中,我希望该DateOfBirth属性是可选的(即在DB中为NULL).
这是我的示例代码:
namespace BusinessLayer
{
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这些领域是否应公开.我应该这样做:
class Program
{
static void Main(string[] args)
{
Person person1 = new Person("Kate","Middleton",null);
}
}
Run Code Online (Sandbox Code Playgroud)
或者像这样:
class Program
{
static void Main(string[] args)
{
Person person1 = new Person();
person1.FirstName = "Kate";
person1.LastName = "Middleton";
}
}
Run Code Online (Sandbox Code Playgroud)
我也想知道我应该如何处理类的可选属性.填写完字段后,如何将它们保存到数据库中?我有一个DatabaseComponenet类来保存信息.保存到数据库时如何处理可选项?
那么,我会做这样的事情:
public int Save()
{
int …Run Code Online (Sandbox Code Playgroud) 我想指的是在之前使用的例子SO 与鸭和鸭电:
public interface IDuck
{
void Swim();
}
public class Duck : IDuck
{
public void Swim()
{
//do something to swim
}
}
public class ElectricDuck : IDuck
{
public void Swim()
{
if (!IsTurnedOn)
return;
//swim logic
}
public void TurnOn()
{
this.IsTurnedOn = true;
}
public bool IsTurnedOn { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
LSP的原始违规将如下所示:
void MakeDuckSwim(IDuck duck)
{
if (duck is ElectricDuck)
((ElectricDuck)duck).TurnOn();
duck.Swim();
}
Run Code Online (Sandbox Code Playgroud)
作者的一个解决方案是将Logic放入电动鸭子的游泳方法中以使自己开启:
public class ElectricDuck : IDuck
{
public void Swim() …Run Code Online (Sandbox Code Playgroud) 我正在尝试为实现的只读集合编写一个抽象基类IList.这样的基类应该实现set-indexer来抛出a NotSupportedException,但是将get-indexer保留为abstract.C#是否允许这种情况?这是我到目前为止所拥有的:
public abstract class ReadOnlyList : IList {
public bool IsReadOnly { get { return true; } }
public object this[int index] {
get {
// there is nothing to put here! Ideally it would be left abstract.
throw new NotImplementedException();
}
set {
throw new NotSupportedException("The collection is read-only.");
}
}
// other members of IList ...
}
Run Code Online (Sandbox Code Playgroud)
理想情况下ReadOnlyList,能够实现setter,但保留getter摘要.有没有允许这个的语法?