标题Java设计模式–工厂模式
工厂模式是我们最常用的实例化对象模式了,是用工厂方法代替new操作的一种模式。
- 简单工厂
这个在真正意义上并不算一个设计模式,准确说,是一种编程习惯,将代码分成稳定的部分和抽象的部分,通过封装构造器的方式可以更高效的管理代码,很简单,有助于理解
public class FactoryMethod {
public static void main(String[] args) {
Application application=new Application();
Product product=application.getObject("0");
product.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product{
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("ProductA.method1 executed");
}
}
class ProductA1 implements Product{
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("ProductA1.method1 executed");
}
}
class SimpleFactory{
public static Product createProduct(String type) {
if("0".equals(type)) {
return new ProductA();
}else if("1".equals(type)){
return new ProductA1();
}else {
return null;
}
}
}
//这里我们认为Application是稳定的
class Application{
private Product createProduct(String type) {
return SimpleFactory.createProduct(type);
}
Product getObject(String type) {
Product product=createProduct(type);
//你的处理
return product;
}
}
- 抽象工厂
上面的代码我们简单的讲了一下关于代码的稳定部分和抽象部分,这里,我们将简单工厂稍作改进,将一些冗余的代码去除,将我们认为稳定的Application类改造为抽象类,并提供实现类,这样在一定程度上是代码的可扩展性更高了,这便是抽象工厂
public class FactoryMethod {
public static void main(String[] args) {
Application application=new conCreateProductA();
Product product=application.getObject("0");
product.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product{
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("ProductA.method1 executed");
}
}
class ProductA1 implements Product{
@Override
public void method1() {
// TODO Auto-generated method stub
System.out.println("ProductA1.method1 executed");
}
}
abstract class Application{
abstract Product createProduct();
Product getObject(String type) {
Product product=createProduct();
return product;
}
}
class conCreateProductA extends Application{
@Override
Product createProduct() {
//你的处理。。。。
return new ProductA();
}
}
class conCreateProductA1 extends Application{
@Override
Product createProduct() {
//你的处理。。。。
return new ProductA1();
}
}
-
应用场景:
1.当你不知道改使用对象的确切类型的时候 2.当你希望为库或框架提供扩展内部组件的方法时
-
主要优点:
1.将具体产品和创建者解耦 2.符合单一职责原则 3.符合开闭原则
-
应用:
例如Java的Calendar.getInstance()方法是静态工厂,java.net.URLStreamHandlerFactory()是工厂方法,感兴趣可 以进行阅读,再例如,著名的Jive论坛 ,就大量使用了工厂模式,所以以后new时就要多个心眼,是否可以考虑使用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量。