【设计模式】
前言
在实际开发过程中,有些情况下会遇到需要创建有共同类型的对象,而且对象之间又有一些共同的属性与行为。比如猫和狗,都是哺乳动物,同时邮箱相同的属性4条腿。
一、简单工厂
简单工厂不是设计模式,而是一种开发习惯。
在创建对象过程中通过某一个类型来区分不同的对象,从而创建出需要的对象。
例如
共同的行为 Product
package com.wwh.designModel.simpleFactory;
public interface Product {
public void method();
}
每一个对象都去具体实现行为
public class ProductA implements Product {
@Override
public void method() {
System.out.println("ProductA method!");
}
}
public class ProductB implements Product {
@Override
public void method() {
System.out.println("ProductB method");
}
}
根据类型来创建需要的对象
package com.wwh.designModel.simpleFactory;
public class SimpleFactory {
private Product createProduct(String type) {
if (type.equals("0")) {
return new ProductA();
} else if (type.equals("1")) {
return new ProductB();
} else {
return null;
}
}
public Product getObject(String type) {
return createProduct(type);
}
}
测试案例
package com.wwh.designModel.simpleFactory;
public class test {
public static void main(String[] args) {
SimpleFactory simpleFactory = new SimpleFactory();
Product product = simpleFactory.getObject("1");
product.method();
}
}
二、工厂方法模式
工厂方法模式对比简单工厂大致相同,不同点在于对象的创建上,将获取对象的共同点保留,创建对象的不同点留给子类去具体实现。
例如
共同的行为 Product
package com.wwh.designModel.simpleFactory;
public interface Product {
public void method();
}
每一个对象都去具体实现行为
public class ProductA implements Product {
@Override
public void method() {
System.out.println("ProductA method!");
}
}
public class ProductB implements Product {
@Override
public void method() {
System.out.println("ProductB method");
}
}
使用抽象类将相同行为实现,不同点留给子类去具体实现
package com.wwh.designModel.factoryMethod;
public abstract class AbstractFactory {
public abstract Product createProduct();
public Product getObject() {
return createProduct();
}
}
子类具体实现
package com.wwh.designModel.factoryMethod;
public class FactoryProductA extends AbstractFactory {
@Override
public Product createProduct() {
return new ProductA();
}
}
package com.wwh.designModel.factoryMethod;
public class FactoryProductB extends AbstractFactory {
@Override
public Product createProduct() {
return new ProductB();
}
}
测试案例
package com.wwh.designModel.factoryMethod;
public class test {
public static void main(String[] args) {
AbstractFactory abstractFactory = new FactoryProductA();
Product product = abstractFactory.getObject();
product.method();
}
}
总结
在实际开发的过程中,如果对象种类不是很多的话,其实使用简单工厂就可以应对了。但是一旦后续还有种类要增加的话就涉及到需要更改旧代码,引来未知的风险。而使用工厂方法模式的话就避免了以上的问题,有新的种类增加,就只需要增加一个子类实现即可。