介绍
工厂方法模式:定义一个用来创建对象的接口,让子类决定实例化哪一个类,让子类决定实例化延迟到子类。工厂方法模式是针对每个产品提供一个工厂类,在客户端中判断使用哪个工厂类去创建对象
UML
总结
对于简单工厂模式而言,创建对象的逻辑判断放在了工厂类中,客户不感知具体的类,但是其违背了开闭原则,如果要增加新的具体类,就必须修改工厂类。
对于工厂方法模式而言,是通过扩展来新增具体类的,符合开闭原则,但是在客户端就必须要感知到具体的工厂类,也就是将判断逻辑由简单工厂的工厂类挪到客户端。
实例
package HomeWork2;
public interface Shape {
public void printShape();
}
package HomeWork2;
public class Line implements Shape{
public void printShape(){
System.out.print("this is Line");
}
}
package HomeWork2;
public class Rectangle implements Shape{
public void printShape(){
System.out.print("this is Rectangle");
}
}
package HomeWork2;
public class Round implements Shape{
public void printShape(){
System.out.print("this is Round");
}
}
package HomeWork2;
public interface ShapeFactory {
public Shape createShape();
}
```java
package HomeWork2;
public class RectangleFactory implements ShapeFactory{
public Shape createShape(){
return new Rectangle();
}
}
package HomeWork2;
public class RoundFactory implements ShapeFactory{
public Shape createShape(){
return new Round();
}
}
package HomeWork2;
public class LineFactory implements ShapeFactory{
public Shape createShape(){
return new Line();
}
}
package HomeWork2;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
enum ape{
Line,Rectangle,Round;
public static ape getshape(String ss){
return valueOf(ss);
}
}
public class Client {
public void draw(Shape s){
System.out.println("I draw a Shape");
s.printShape();
}
public void showlist(List<Shape> shape){
System.out.println();
System.out.println("现在画板里有:");
Shape t;
for(int i=0;i<shape.size();i++){
t=shape.get(i);
System.out.print("<");
t.printShape();
System.out.print(">");
if((i+1)%2==0) System.out.println();
}
System.out.println();
}
public void printMenu(){
System.out.println("1:添加图形");
System.out.println("2:删除图形");
System.out.println("3:退出");
}
public List<Shape> delete(List<Shape> shape){
shape.remove(shape.size()-1);
return shape;
}
public void operate(){
//ShapeFactory sf=new ShapeFactory();
List<Shape> shape=new ArrayList<>();
Scanner scanner=new Scanner(System.in);
while(true)
{ //System.out.println("----------------------------------------------");
System.out.println("请选择你需要的功能:");
printMenu();
ShapeFactory sf=null;
int id=scanner.nextInt();
switch(id){
case 1: System.out.println("请输入你要画的图形:");
String type=scanner.next();
switch(ape.getshape(type)){
case Line:sf=new LineFactory();break;
case Rectangle:sf=new RectangleFactory();break;
case Round:sf=new RoundFactory();break;
default:System.out.println("请拼写正确的图形!");
}
Shape s=sf.createShape();
draw(s);
shape.add(s);
showlist(shape);
break;
case 2:System.out.print("删除上一次所画的图形:");
shape=delete(shape);
showlist(shape);
break;
case 3:return;
default:System.out.println("请输入正确的服务号!");
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Client c=new Client();
c.operate();
}
}
`