本文向您展示了如何理解Java工厂方法模式。内容简洁易懂。一定会让你眼前一亮。希望通过这篇文章的详细介绍,你能有所收获。
00-1010 1.定义:定义一个工厂类,可以根据不同的参数返回不同类的实例。创建的实例通常有一个公共的父类。
2.在工厂方法模式中,用于创建实例的方法通常是静态的,因此工厂方法模式也称为静态工厂方法。
3.你需要的,只需要传入一个正确的参数,就可以得到需要的对象,而不需要知道它的实现过程。
4.例如,我开了一家比萨饼店。当顾客需要某种披萨,我可以在这家店做的时候,我会给他们提供他们需要的披萨(当然是为了钱哈哈)。如果我没有他们需要的,那就另当别论了,我们以后再谈。此时我披萨店就可以看做工厂(Factory),工厂生产的披萨被成为产品(Product),披萨的名称则被称为参数可以根据不同的参数返回不同的产品,这就是工厂方法模式。
简单工厂模式概述
简单工厂模式的结构与实现
1.工厂3360的核心部分负责实现创建所有产品的内部逻辑,外部世界可以直接调用工厂类来创建所需的对象。
2.产品(抽象产品):工厂类创建的所有对象的父类封装了产品对象的公共方法,所有具体产品都是它的子对象。
3.具体产品:工厂方法模式的创造目标。所有创建的对象都是特定类的实例。它实现在抽象产品中声明的抽象方法(关于抽象类)。
结构:
抽象类产品
{
publicvoidMethName()
{
//公共方法的实现
}
publicatabstractvoidmethodiff();
//声明抽象业务方法
}
类别混凝土产品a :产品
{
publicoverridevoidMethodDiff()
{
//业务方法的实现
}
}
分类工厂
{
publicationstaticproductgetproduct(string)
{
Productproduct=null
if(arg。等于(' A ')
{
product=new concreteProducA();
//初始化
}
elseif(arg。等于(' B ')
nbsp; {
product = new ConcreteProductB();
//init
}
else
{
....//其他情况
}
return product;
}
}
class Program
{
static void Main(string[] args)
{
Product product;
product = Factory.GetProduct("A");//工厂类创建对象
Product.MethName();
product.MethodDiff();
}
}
简单工厂模式的简化
1.为了简化简单工厂模式,将抽象产品类和工厂类合并,将静态工厂方法移到抽象产品类中
客户端可以调用产品父类的静态工厂方法,根据不同的参数创建不同类型的产品子类对象。
简单工厂模式的优缺点和适用环境
简单工厂模式的优点
(1)工厂类包含必要的逻辑判断,可以决定在什么时候创建哪一个产品的实例。客户端可以免除直接创建产品对象的职责
(2)客户端无需知道所创建具体产品的类名,只需知道参数即可
(3)也可以引入配置文件,在不修改客户端代码的情况下更换和添加新的具体产品类。(这也是我在开始的披萨店里遇到没有的披萨的解决情况)
简单工厂模式的缺点
(1)工厂类集中了所有产品的创建逻辑,职责过重,一旦异常,整个系统将受影响
(2)使用简单工厂模式会增加系统中类的个数(引入新的工厂类),增加系统的复杂度和理解难度
(3)系统扩展困难,一旦增加新产品不得不修改工厂逻辑,在产品类型较多时,可能造成逻辑过于复杂
(4)简单工厂模式使用了static工厂方法,造成工厂角色无法形成基于继承的等级结构。
简单工厂模式的适用环境
(1)工厂类负责创建对的对象比较少,因为不会造成工厂方法中的业务逻辑过于复杂
(2)客户端只知道传入工厂类的参数,对如何创建对象不关心
简单案例
题目:
使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法要求在绘制不支持的几何图形时,抛出一个UnsuppShapeException异常,绘制类图并使用C#语言实现。
UML:
using System; using System.Collections.Generic; using System.Linq; using System.Text; /*使用简单工厂模式设计一个可以创建不同几何图形(Shape),如Circle,Rectangle,Triangle等绘图工具类,每个几何图形均具有绘制Draw()和擦除Erase()两个方法 * 要求在绘制不支持的几何图形时,抛出一个UnsuppShapeException异常,绘制类图并使用C#语言实现。 */ namespace SimpleShapeFactory { public interface InShape//图形接口 抽象产品类 { void Draw(); void Erase(); } public class Circle : InShape//圆形类,具体产品类 { private static int count; //生成图形计数 string radious; public Circle()//构造 { Console.WriteLine("Create Circle"); Console.WriteLine("Input the radious of Circle:"); radious = Console.ReadLine(); } public void Draw()//实现接口方法 { int Radious = int.Parse(radious); Console.WriteLine("Display circle " + (++count) +" information:"); Console.WriteLine("Circle "+ count+ " circumference:" + 2 * Radious * 3.14159); Console.WriteLine("Circle "+ count+" area:" + 3.14159 * Radious * Radious); } public void Erase()//实现接口方法 { while (true) { Console.WriteLine("Erase current shape(y/n)?"); string choose; choose = Console.ReadLine(); if (choose.Equals("y") || choose.Equals("Y")) { Console.WriteLine("Erase Circle "+count +" successfully!"); count--; break; } else if (choose.Equals("n") || choose.Equals("N")) { Console.WriteLine("Circle "+ count+" successfully saved!"); break; } else { Console.WriteLine("Input error, re-enter!"); } } } } class Rectangle : InShape//矩形类,具体产品类 { private static int count = 0;//生成图形计数 string length; string wideth; public Rectangle()//构造 { Console.WriteLine("Create Rectangle"); Console.WriteLine("Input the length and wideth of Rectangle:"); length = Console.ReadLine(); wideth = Console.ReadLine(); } public void Draw()//实现接口方法 { int Length = int.Parse(length); int Wideth = int.Parse(wideth); Console.WriteLine("Display rectangle " + (++count) + " information:"); Console.WriteLine("Rectangle "+ count + "circumference:" + 2 * Length * Wideth); Console.WriteLine("Rectangle "+ count + "area:" + Length * Wideth); } public void Erase()//实现接口方法 { while (true) { Console.WriteLine("Erase current shape(y/n)?"); string choose; choose = Console.ReadLine(); if (choose.Equals("y") || choose.Equals("Y")) { Console.WriteLine("Erase rectangle "+count+ "successfully!"); --count; break; } else if (choose.Equals("n") || choose.Equals("N")) { Console.WriteLine("Rectangle "+ count+" successfully saved!"); break; } else { Console.WriteLine("Input error, re-enter!"); } } } } class Triangle : InShape//三角形类,具体产品类 { private static int count = 0;//生成图形计数 string lengtha; string lengthb; string lengthc; public Triangle()//构造 { Console.WriteLine("Create Triangle"); Console.WriteLine("Input the lengtha ,lengthb and lengthc of Triangle:"); lengtha = Console.ReadLine(); lengthb = Console.ReadLine(); lengthc = Console.ReadLine(); } public void Draw()//实现接口方法 { int Lengtha = int.Parse(lengtha); int Lengthb = int.Parse(lengthb); int Lengthc = int.Parse(lengthc); if ((Lengtha + Lengthb > Lengthc) && (Lengtha + Lengthc > Lengthb) && (Lengthb + Lengthc > Lengtha)) { double S = (Lengtha + Lengthb + Lengthc) * 0.5; double area = Math.Sqrt(S * (S - Lengtha) * (S - Lengthb) * (S - Lengthc)); Console.WriteLine("Display triangle "+ (++count)+" information:"); Console.WriteLine("Triangle " + count +" circumference:" + (Lengtha + Lengthb + Lengthc)); Console.WriteLine("Triangle "+ count +" area:" + area); Erase(); } else { Console.WriteLine("Create triangle failed!"); } } public void Erase()//实现接口方法 { while (true) { Console.WriteLine("Erase shape(y/n)?"); string choose; choose = Console.ReadLine(); if (choose.Equals("y") || choose.Equals("Y")) { Console.WriteLine("Erase tirangle " +count +" successfully!"); --count; break; } else if (choose.Equals("n") || choose.Equals("N")) { Console.WriteLine("Triangle "+ count +" successfully saved!"); break; } else { Console.WriteLine("Input error, re-enter!"); } } } } class ShapeFactory//图形工厂类,充当工厂类 { public static InShape Getshape(string type)//静态工厂方法 { InShape shape; shape = null; if (type.Equals("Circle")) { shape = new Circle(); Console.WriteLine("Init set Circle"); shape.Draw(); shape.Erase(); } else if(type.Equals("Rectangle")) { shape = new Rectangle(); Console.WriteLine("Init set Rectangle"); shape.Draw(); shape.Erase(); } else if (type.Equals("Triangle")) { shape = new Triangle(); Console.WriteLine("Init set Triangle"); shape.Draw(); } else//异常 这里我应该声明调用异常处理类的,那样会更好些 { Console.WriteLine("UnsupportShapeException!"); Console.WriteLine("Emotional reminders :Pay 1 million$ to Alipay:132****6151 can create every shape you want!!! "); } return shape; } } class Program//客户端测试类 { static void Main(string[] args) { while (true) { InShape shape; Console.WriteLine("Please input the shape you want to create"); string str = Console.ReadLine(); shape = ShapeFactory.Getshape(str);//通过静态工厂方法创建产品 Console.ReadLine(); } } } }
运行结果:
上述内容就是如何理解Java简单工厂模式,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/71904.html