wordpress 评论弹幕,保定seo关键词优化外包,网站建设 php,首页凡客工厂模式属于创建型模式#xff0c;也被称为多态工厂模式#xff0c;它在创建对象时提供了一种封装机制#xff0c;将实际创建对象的代码与使用代码分离#xff0c;有子类决定要实例化的产品是哪一个#xff0c;把产品的实例化推迟到子类。
使用场景
重复代码 : 创建对象…工厂模式属于创建型模式也被称为多态工厂模式它在创建对象时提供了一种封装机制将实际创建对象的代码与使用代码分离有子类决定要实例化的产品是哪一个把产品的实例化推迟到子类。
使用场景
重复代码 : 创建对象 需要使用 大量重复的代码 ;不关心创建过程 : 客户端 不依赖 产品类 , 不关心 实例 如何被创建 , 实现等细节 ;创建对象 : 一个类 通过其 子类 来 指定 创建哪个对象 ; 工厂方法模式的角色
抽象产品Product是定义产品的接口是工厂方法模式创建对象的父类也就是产品对象的公共父类。产品类ConcreteProduct是实现了抽象产品所声明的接口工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。抽象工厂Factory是工厂方法模式的核心所有创建对象的工厂类都必须继承该接口。具体工厂ConcreteFactory是抽象工厂的子类实现了抽象工厂中定义的函数工厂方法模式所创建的每一个对象都是某个具体产品类的实例。
结构图 优缺点
优点
不关心创建细节 : 用户 只需要 关心 所需产品 对应的工厂 , 无需关心创建细节 ;符合开闭原则 : 加入 新产品 , 符合开闭原则 , 提高可扩展性 ;
缺点
增加复杂性类的个数容易过多增加系统复杂度在添加新产品时除了编写 新的产品类之外 还要 编写该产品类对应的工厂类。增加难度增加了系统抽象性和理解难度。工厂方法本身利用了抽象该模式中会 引入抽象层 如果要动态创建产品类还要 引入反射技术。
应用实例
创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo 类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息CIRCLE / RECTANGLE / SQUARE以便获取它所需对象的类型。
抽象产品
public interface Shape {void draw();
} 实现接口的产品类
public class Rectangle implements Shape {Overridepublic void draw() {System.out.println(Inside Rectangle::draw() method.);}
}public class Square implements Shape {Overridepublic void draw() {System.out.println(Inside Square::draw() method.);}
}public class Circle implements Shape {Overridepublic void draw() {System.out.println(Inside Circle::draw() method.);}
}
抽象工厂
public interface Factory {public Shape getShape(String shapeType);
}
具体工厂
public class ShapeFactory implements Factory {//使用 getShape 方法获取形状类型的对象Overridepublic Shape getShape(String shapeType){if(shapeType null){return null;} if(shapeType.equalsIgnoreCase(CIRCLE)){return new Circle();} else if(shapeType.equalsIgnoreCase(RECTANGLE)){return new Rectangle();} else if(shapeType.equalsIgnoreCase(SQUARE)){return new Square();}return null;}
}
使用该工厂通过传递类型信息来获取实体类的对象
public class FactoryPatternDemo {public static void main(String[] args) {ShapeFactory shapeFactory new ShapeFactory();//获取 Circle 的对象并调用它的 draw 方法Shape shape1 shapeFactory.getShape(CIRCLE);//调用 Circle 的 draw 方法shape1.draw();//获取 Rectangle 的对象并调用它的 draw 方法Shape shape2 shapeFactory.getShape(RECTANGLE);//调用 Rectangle 的 draw 方法shape2.draw();//获取 Square 的对象并调用它的 draw 方法Shape shape3 shapeFactory.getShape(SQUARE);//调用 Square 的 draw 方法shape3.draw();}
}
运行结果
Inside Circle::draw() method.
Inside Rectangle::draw() method.
Inside Square::draw() method.