什么时候用:
- 对象的创建过程/实例化准备工作很复杂,需要初始化很多参数、查询数据库等。
- 类本身有好多子类,这些类的创建过程在业务中容易发生改变,或者对类的调用容易发生改变。栗子.自主创建需要的产品对象(小米和苹果),达到增加新产品时无需修改其他具体的工厂和具体类的目的。
简单工厂模式
这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在简单工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。
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{
public void method1(){
System.out.println("ProductA.method1 executed");
}
}
class ProductB implements Product{
public void method1(){
System.out.println("ProductB.method1 executed");
}
}
//简单工厂
class SimpleFactory{
public static Product createProduct(String type){
if(type.equals("0")){
return new ProductA();
}else if(type.equals("1")){
return new ProductB();
}else{
return null;
}
}
}
class Application{
private Product createProduct(String type){
return SimpleFactory.createProduct(type);
}
Product getObject(String type){
Product product = createProduct(type);
return product;
}
}
抽象工厂模式
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
在抽象工厂模式中,接口是负责创建一个相关对象的工厂,不需要显式指定它们的类。每个生成的工厂都能按照工厂模式提供对象。
public class FactoryMethod {
public static void main(String[] args) {
//创建对象可以变化
Application application = new ConcreteProductA();
Product product = application.getObject();
product.method1();
}
}
interface Product{
public void method1();
}
class ProductA implements Product{
public void method1(){
System.out.println("ProductA.method1 executed");
}
}
class ProductB implements Product{
public void method1(){
System.out.println("ProductB.method1 executed");
}
}
//class SimpleFactory{
// public static Product createProduct(String type){
// if(type.equals("0")){
// return new ProductA();
// }else if(type.equals("1")){
// return new ProductB();
// }else{
// return null;
// }
// }
//}
//抽象工厂
abstract class Application{
abstract Product createProduct();
Product getObject(){
Product product = createProduct();
return product;
}
}
//符合开闭原则,单一职责原则
class ConcreteProductA extends Application{
Product createProduct() {
return new ProductA();
}
}
应用实例
Hibernate 换数据库只需换方言和驱动就可以。