Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

简单工厂模式(静态工厂模式)

简单工厂模式:定义一个工厂类,在该类的统一静态方法中根据不同的参数实例化不同的对象。

UML图:

1597152170059

手机抽象类,抽象不同的产品

1
2
3
public interface AbstractPhone {
void make();
}

手机实现类

1
2
3
4
5
6
7
8
9
10
11
12
public class HuaweiPhone implements AbstractPhone {
public HuaweiPhone() {
this.make();
}

@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造华为手机");
}

}
1
2
3
4
5
6
7
8
9
10
11
12
13
public class MiPhone implements AbstractPhone {

public MiPhone() {
this.make();
}

@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产小米手机");
}

}

简单工厂类

1
2
3
4
5
6
7
8
9
10
public class PhoneFactory {
public static AbstractPhone getPhone(String phoneType) {
if ("MiPhone".equals(phoneType)) {
return new MiPhone();
} else if ("HuaweiPhone".equals(phoneType)) {
return new HuaweiPhone();
}
return null;
}
}

测试类

1
2
3
4
5
6
7
8
9
10
11
12
public class FactoryPattern {

public static void main(String[] args) {
AbstractPhone miPhone = PhoneFactory.getPhone("MiPhone");
AbstractPhone huaweiPhone = PhoneFactory.getPhone("HuaweiPhone");
}

}
/**
生产小米手机
制造华为手机
*/

Cons&Pros

  • 使用静态方法将实例的创建和使用分离开。只需要调用静态方法就能获得需要的对象。

  • 这种设计模式的问题在于,每添加一个新的产品就需要修改静态方法,不利于软件的维护。同时把所有的产品都放在一个当中将会导致该类十分臃肿。

工厂方法模式

工厂方法模式是对简单工厂模式的进一步解耦,因为在工厂模式中一个工厂子类对应一个产品子类。

1597325248862

工厂接口和产品接口

1
2
3
4
5
package javatest.pattern.factorymethod;

public interface AbstractFactory {
public AbstractPhone createPhone();
}
1
2
3
4
5
package javatest.pattern.factorymethod;

public interface AbstractPhone {
public void make();
}

具体工厂类

1
2
3
4
5
6
7
public class HuaweiFactory implements AbstractFactory{
@Override
public AbstractPhone createPhone() {
// TODO Auto-generated method stub
return new HuaweiPhone();
}
}
1
2
3
4
5
6
7
public class MiFactory implements AbstractFactory {
@Override
public AbstractPhone createPhone() {
// TODO Auto-generated method stub
return new MiPhone();
}
}

具体产品类

1
2
3
4
5
6
7
8
9
10
public class HuaweiPhone implements AbstractPhone {
public HuaweiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("制造华为手机");
}
}
1
2
3
4
5
6
7
8
9
10
public class MiPhone implements AbstractPhone {
public MiPhone() {
this.make();
}
@Override
public void make() {
// TODO Auto-generated method stub
System.out.println("生产小米手机");
}
}

Cons&Pros

  • 1- 工厂方法模式,在简单工厂模式的基础上进一步解耦,将各个产品的工厂单独继承一个抽象工厂类,把统一的工厂方法分解到了各个对应产品的工厂中。如此一来,如果需要添加一个产品只需要新继承一个类,用它类进行创建对象就可以。不需要修改其他代码。

    2- 工厂方法模式,它克服了简单工厂模式违背开-闭原则,有保持了面向对象的封装性。

  • 工厂方法模式的缺点是每增加一个产品类,就需要增加一个对应的工厂类,增加了额外的开发量。

抽象工厂模式

评论