设计模式-工厂模式_简单工厂模式

时间:2022-07-29 20:32:16

工厂模式几种形态 

        工厂模式专门负责将大量有共有接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类.工厂模式的3中形态

简单工厂模式(Simple Factory)-简单原型

设计模式-工厂模式_简单工厂模式

简单工厂模式主要由工厂(Creator)角色,抽象产品(Product)角色,具体产品(Concrete Product)角色组成

如果系统只有一个具体角色的话,可以省略掉抽象产品角色

在有些情况下,工厂角色可以由抽象产品角色扮演

如果抽象角色已经被省略,而工厂角色就可以与具体产品角色合并.换言之,一个产品类为自身的工厂

案例:绘图员系统

UML

设计模式-工厂模式_简单工厂模式


/**  * @Description By:抽象画图类接口  * @Date : Created in 16:29 2018/6/13  * @Author : zhou jiao  */ public interface Shape {

    /**  * 定义画图行为  */  void draw();

    /**  * 定义擦除行为  */  void erase();
}
/**  * @Description By:正方形产品  * @Date : Created in 16:46 2018/6/13  * @Author : zhou jiao  */  public class Square implements Shape {
    @Override
    public void draw() {
        System.out.println("画方形");
    }

    @Override
    public void erase() {
        System.out.println("擦除方形");
    }
}
/**  * @Description By:圆形产品  * @Date : Created in 16:43 2018/6/13  * @Author : zhou jiao  */  public class Circle implements Shape {


    @Override
    public void draw() {
        System.out.println("画圆");
    }

    @Override
    public void erase() {
        System.out.println("擦除圆");
    }
}
/**  * @Description By:三角形产品  * @Date : Created in 16:49 2018/6/13  * @Author : zhou jiao  */ public class Triangle implements Shape {
    @Override
    public void draw() {
        System.out.println("画三角形");
    }

    @Override
    public void erase() {
        System.out.println("擦除三角形");
    }
}
public class ArtTracerFactory {

    public static Shape factory(String which) throws Exception {
        if("circle".equalsIgnoreCase(which)){
            return new Circle();
        } else if ("square".equalsIgnoreCase(which)) {
            return new Square();
        } else if ("triangle".equalsIgnoreCase(which)) {
            return new Triangle();
        } else {
            throw new Exception(which);
        }

    }
}
public class ArtTracer {

    public static void main(String[] args) {
        try {
            Shape  shape =ArtTracerFactory.factory("circle");
            shape.draw();
            shape.erase();
            shape = ArtTracerFactory.factory("square");
            shape.draw();
            shape.erase();
            shape = ArtTracerFactory.factory("triangle");
            shape.draw();
            shape.erase();
            shape = ArtTracerFactory.factory("a");
            shape.draw();
            shape.erase();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

比较经典的简单工厂模式在java的dateFormat类 其中抽象产品dataFormat也是工厂对象,产出自己的子类具体对象。通过getDateInstance()静态方法的重载获取不同的实例对象.具体细节可查看源码进行学习


简单工厂模式的优点

1.降低耦合

2.实现对责任的分割

简单工厂模式的缺点

1.当产品类有复杂的多层次等级结构时,工厂类的功能会极为庞大,导致系统在将来进行功能扩展时较为困难

2.由于简单工厂模式使用静态方法作为工厂方法,静态方法无法有子类继承

3.当增加新的产品时会增加其他的具体抽象角色,同时工厂角色也要增加对应的功能,导致耦合过高