工厂模式
- 使用工厂模式意义:工厂方法(Factory Method)模式的意义是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类当中。核心工厂类不再负责产品的创建,这样核心类成为一个抽象工厂角色,仅负责具体工厂子类必须实现的接口,这样进一步抽象化的好处是使得工厂方法模式可以使系统在不修改具体工厂角色的情况下引进新的产品。
下面分别从工厂模式和抽象工厂模式分别实现
- 工厂模式
- 使用场景:例如现在需要创建三个图形,分别为长方形(Rectangle ),圆形(Circle ),正方形(Square ), 他们有共同属性 draw(),那么我们就可以设计成由 Space Factory 生产对应图形
- 优点:上述三种图形我们交给Space Factory 类去分别实现不同图形的 draw()方法,我们不用去理会不同图形具体的实现细节
- 缺点:实现代码稍微不符合 “开-闭原则”, 如果后期图形增加比较少,这样的模式也是可以使用的
public interface Space {
void draw();
}
public class Circle implements Space {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Rectangle implements Space {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Space {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public class SpaceFactory {
public static Space getSpace(String spaceType) throws Exception {
if (spaceType.equalsIgnoreCase("CIRCLE")) {
return new Circle();
} else if (spaceType.equalsIgnoreCase("RECTANGLE")) {
return new Rectangle();
} else if (spaceType.equalsIgnoreCase("SQUARE")) {
return new Square();
}else {
throw new Exception("space type is errpr");
}
}
}
public class SpaceFactoryDemo {
public static void main(String[] args) throws Exception {
Space space1 = SpaceFactory.getSpace("CIRCLE");
space1.draw();
Space space2 = SpaceFactory.getSpace("RECTANGLE");
space2.draw();
}
}
- 抽象工厂模式
- 使用场景:例如现在需要创建三个图形,分别为长方形(Rectangle ),圆形(Circle ),正方形(Square ), 他们有共同属性 draw(),那么我们就可以设计成由 不同图形对应的 Factory 生产对应图形
- 优点:
- 上述三种图形我们交给不同图形的 Factory 类去分别实现不同图形的 draw()方法,我们不用去理会不同图形具体的实现细节
- 做到了 开-闭原则
- 缺点:实现稍微复杂,代码量较大
public interface Space {
void draw();
}
public class Circle implements Space {
@Override
public void draw() {
System.out.println("Inside Circle::draw() method.");
}
}
public class Rectangle implements Space {
@Override
public void draw() {
System.out.println("Inside Rectangle::draw() method.");
}
}
public class Square implements Space {
@Override
public void draw() {
System.out.println("Inside Square::draw() method.");
}
}
public abstract class SpaceFactoryAbstract {
public abstract Space getSpace();
}
public class CircleFactory extends SpaceFactoryAbstract {
@Override
public Space getSpace() {
return new Circle();
}
}
public class RectangleFactory extends SpaceFactoryAbstract {
@Override
public Space getSpace() {
return new Rectangle();
}
}
public class SquareFactory extends SpaceFactoryAbstract {
@Override
public Space getSpace() {
return new Square();
}
}
public class SpaceFactoryDemo {
public static void main(String[] args) throws Exception {
Space space1 = SpaceFactory.getSpace("CIRCLE");
space1.draw();
Space space2 = SpaceFactory.getSpace("RECTANGLE");
space2.draw();
}
}
如果存在遗漏,敬请留言,卤煮尽快改正