首页 / C# / c# – 使用使用工厂模式创建的类型
c# – 使用使用工厂模式创建的类型
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 使用使用工厂模式创建的类型,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3018字,纯文字阅读大概需要5分钟。
内容图文
![c# – 使用使用工厂模式创建的类型](/upload/InfoBanner/zyjiaocheng/791/73804a907f284b538da5dcd64642db46.jpg)
我有一个工厂返回IShape类型.工厂建造如Circle,Square等具体类,如下所示.
public class ShapeFactory
{
public IShape GetShape(Shape shape, string name)
{
IShape s = null;
switch (shape)
{
case Shape.Square: s = new Square(name);
break;
case Shape.Triangle: s = new Triagle(name);
break;
case Shape.Circle: s = new Circle(name);
break;
}
return s;
}
}
用户可以编辑任何IShapes,但每个具体类需要不同的对话框来编辑各种属性.检测形状类型的最佳方法是什么?
目前我有一个void Edit(IShape shape)方法,它执行一系列if检查
public static void Edit(IShape shape)
{
if (shape == Square)
new EditSquare(shape as Square).ShowDialog();
else if (shape == Triangle)
new EditTriangle(shape as Triangle).ShowDialog();
}
这是一种合理的方法吗?什么是最好的方法来解决这个问题.
编辑:
每个具体类派生自定义一些基本属性的抽象Shape类
public abstract class Shape
{
public string Name { get; set; }
public Rect Boundary { get; }
public double Area { get; protected set; }
}
IShape公开了用户想要执行的一些功能
public interface IShape
{
void Translate(Vector v);
void Calculate();
}
谢谢
解决方法:
如果您需要根据对象的类型显式切换行为,这通常是设计错误的标志.无论何时添加形状,都必须更新执行这些基于类型的开关的所有位置.
在这些情况下,你的主要“武器”是polymorphism和virtual functions.
在最简单的方法中,您可以在IShape上创建一个自己创建编辑器的方法:
public interface IShape {
IShapeEditor CreateEditor();
}
public interface IShapeEditor {
void ShowDialog();
}
public class Square : IShape {
public IShapeEditor CreateEditor(){
return new SquareEditor(this);
}
}
public class Triangle: IShape {
public IShapeEditor CreateEditor(){
return new TriangleEditor(this);
}
}
public class Circle: IShape {
public IShapeEditor CreateEditor(){
return new CircleEditor(this);
}
}
在这种情况下,您的Edit方法可能如下所示:
public static void Edit(IShape shape)
{
shape.CreateEditor().ShowDialog();
}
这种方法的一个问题是你可能不希望知道编辑器的形状.试图解决此问题的模式是visitor pattern.
使用访问者模式可能是这样的:
public interface IShapeVisitor {
void VisitSquare(Square s);
void VisitTriangle(Triangle t);
void VisitCircle(Circle c);
}
public interface IShape {
void Accept(IShapeVisitor visitor);
}
public class Square : IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitSquare(this);
}
}
public class Triangle: IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitTriangle(this);
}
}
public class Circle: IShape {
public void Accept(IShapeVisitor visitor){
visitor.VisitCircle(this);
}
}
这是基本结构.对于你知道的编辑器,创建一个这样的访问者:
public class EditorCreationVisitor : IShapeVisitor{
IShapeEditor editor;
public void VisitSquare(Square s ){
editor = new SquareEditor(s);
}
public void VisitTriangle(Triangle t ){
editor = new TriangleEditor(t);
}
public void VisitCircle(Circle c ){
editor = new CircleEditor(c);
}
public IShapeEditor Editor {get{return editor;}}
}
您的编辑方法将如下所示:
public static void Edit(IShape shape)
{
var visitor = new EditorCreationVisitor();
shape.Accept(visitor);
var editor = visitor.Editor;
editor.ShowDialog();
}
如果不同形状类型的数量相当恒定,则访问者模式最有效,但您可以定期添加不同的行为.
内容总结
以上是互联网集市为您收集整理的c# – 使用使用工厂模式创建的类型全部内容,希望文章能够帮你解决c# – 使用使用工厂模式创建的类型所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。