转载:https://blog.youkuaiyun.com/qq_38238296/article/details/79841395
工厂模式的本质:
- 工厂模式又称为创建模式,它是创建对象的一种最佳方式。工厂模式的本质就是用工厂方法代替new操作创建一种实例化对象的方式。一句话总结就是方便创建同种类型接口产品的复杂对象。
- ex:实例化一个对象sample一般会想到的方法是通过构造器类创建sample s = new sample();但是在实际情况下最好不要这样做,如果sample类的实例化的时候需要初始化参数而这些参数需要别的类的信息,这样你new的话,会增加代码的耦合度,不利于维护。所以我们需要将创建实例的工作和使用实例分开,即:使用工厂方法创建实例的工作封装起来。这样我们在需要调用对象的时候就不需要关心那些复杂的实例化问题了。
简单工厂模式:
- 抽象产品类、具体产品类、具体工厂类
- 代码如下:
/**
* 抽象产品类
*/
public abstract class Shape {
abstract void shpe();
}
/**
* 具体产品类
*/
public class Circle extends Shape{
@Override
void shpe() {
System.out.println("this is circle");
}
}
public class Rectangle extends Shape {
@Override
void shpe() {
System.out.println("this is Rectangle");
}
}
public class Triangle extends Shape {
@Override
public void shape() {
System.out.println("this is 三角形");
}
}
/**
* 简单工厂模式,生产产品的工厂类
*/
public class ShapeFactory {
public static Shape creat(String name){
if(name.equals("circle")){
return new Circle();
}else if(name.equals("Rectangle")){
return new Rectangle();
}else if(name.equals("Triangle")){
return new Triangle();
}else {
return null;
}
}
public static void main(String[] args) {
ShapeFactory.creat("circle").shape();
ShapeFactory.creat("Rectangle").shape();
ShapeFactory.creat("Triangle").shape();
}
}
- 简单工厂模式可看出使用一个静态方法将实例化的创建和使用分开。我们只需要调用方法传递参数就可以获得我们需要的对象
- 缺点:不难看出扩展性差,需要添加一个新产品是,不见要增加新产品类,还要修改原来的工厂代码,这样违背了开闭原则
我们也可以将工厂模式抽象出来,这样在增加产品时,只需要增加具体新产品类和抽象新产品工厂模式即可,不需要修改原来的代码
工厂方法模式:
- 抽象工厂:工厂模式的核心,提供一个创建对象的接口,任何需要创建对象的具体工厂都要实现这个接口
- 具体工厂:实现抽象工厂接口的类,收到调用者的调用,从而创建对象
- 抽象产品:工厂方法模式所创建的对象的超类,也就是所有具体产品的共同父类
- 具体产品:实现抽象产品接口的类。工厂模式所创建的对象都是具体产品的实例
代码:
/**
* 抽象产品类
*/
public abstract class Shape {
abstract void shpe();
}
/**
* 具体产品类
*/
public class Circle extends Shape{
@Override
void shpe() {
System.out.println("this is circle");
}
}
public class Rectangle extends Shape {
@Override
void shpe() {
System.out.println("this is Rectangle");
}
}
public class Trangle extends Shape {
@Override
void shpe() {
System.out.println("this is Trangle");
}
}
/**
* 抽象工厂类
*/
public abstract class CreatFactory {
public abstract Shape create();
}
/**
* 具体工厂类
*/
public class CricleFactory extends CreatFactory {
@Override
public Shape create() {
return new Circle();
}
}
public class RectangleFactory extends CreatFactory {
@Override
public Shape create() {
return new Rectangle();
}
}
public class TrangleFactory extends CreatFactory {
@Override
public Shape create() {
return new Trangle();
}
}
public class Test {
public static void getShape(CreatFactory cf){
cf.create();
}
public static void main(String[] args) {
Test.getShape(new CricleFactory());
}
}
- 如上代码所示:新增一个新的形状类,我们也需要增加响应的工厂类和具体产品类,不需要修改原先的代码。当需要新产品时,只需要调用getShape()方法,其它的不需要关心,不需要了解方法的实现,不需要了解对象时如何创建的阿,我们只需要调用方法就好了--良好的封装性
优点:
- 良好的封装性
- 可以使得代码结构变得清晰,有效的封装变化,通常new一个具体类是很复杂多变的,通过工厂的方法将new的过程封装在具体的工厂中,调用者无需知道实例化的过程,只需要调用方法就可以的得到自己想要的产品。
用到工厂模式的地方:
- 创建对象的复杂度高
- 创建对象时需要增加以来关系,就是说需要某些信息而这些信息不在复合类中
- 当系统需要比较好的延展性时
抽象工厂模式:与工厂方法模式的不同点是,抽象工厂模式针对多个产品(抽象多个产品类),工厂方法模式针对单个产品(抽象单个产品类)。