一、工厂模式的概念
工厂模式是面向对象设计中最常用的设计模式之一。它是一种创建型模式,其主要思想是定义一个创建对象的接口,将对象的创建和使用分离开。
二、简单工厂模式
简单工厂模式(Simple Factory Pattern)又称静态工厂方法(Static Factory Method)模式,它是工厂模式的一种。简单工厂模式是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品对象。简单工厂模式只需要一个工厂类就可以完成所有的产品创建任务,而且这个工厂类可以被外界直接调用,而不需要暴露产品对象创建的逻辑。 以下是一个简单工厂模式的实现示例:
//定义产品接口
public interface Product {
void show();
}
//定义具体产品类
class ProductA implements Product {
@Override
public void show() {
System.out.println("ProductA");
}
}
class ProductB implements Product {
@Override
public void show() {
System.out.println("ProductB");
}
}
//定义工厂类
public class Factory {
public static Product createProduct(int type) {
switch (type) {
case 0:
return new ProductA();
case 1:
return new ProductB();
default:
return null;
}
}
}
//使用
public class Main {
public static void main(String[] args) {
Product product = Factory.createProduct(0);
if (product != null) {
product.show();
}
}
}
三、工厂方法模式
工厂方法模式(Factory Method Pattern)又称工厂模式,它属于创建型模式。工厂方法模式是定义一个创建产品对象的工厂接口,将实际创建工作推迟到子类中,这样核心类就变成了抽象类。工厂方法模式可以根据需求定义多个具体的工厂类,具体工厂类负责创建具体的产品对象。 以下是一个工厂方法模式的实现示例:
//定义产品接口
public interface Product {
void show();
}
//定义具体产品类
class ProductA implements Product {
@Override
public void show() {
System.out.println("ProductA");
}
}
class ProductB implements Product {
@Override
public void show() {
System.out.println("ProductB");
}
}
//定义工厂接口
public interface Factory {
Product createProduct();
}
//定义具体工厂类
class FactoryA implements Factory {
@Override
public Product createProduct() {
return new ProductA();
}
}
class FactoryB implements Factory {
@Override
public Product createProduct() {
return new ProductB();
}
}
//使用
public class Main {
public static void main(String[] args) {
Factory factory = new FactoryA();
Product product = factory.createProduct();
product.show();
}
}
四、抽象工厂模式
抽象工厂模式(Abstract Factory Pattern)是一种创建型模式,它提供了一种创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。抽象工厂模式通常用于创建一组产品族,而工厂方法模式通常用于创建一个产品。 以下是一个抽象工厂模式的实现示例:
//定义产品A接口
public interface ProductA {
void show();
}
//定义产品B接口
public interface ProductB {
void show();
}
//定义具体产品A类
class ConcreteProductA1 implements ProductA {
@Override
public void show() {
System.out.println("ConcreteProductA1");
}
}
class ConcreteProductA2 implements ProductA {
@Override
public void show() {
System.out.println("ConcreteProductA2");
}
}
//定义具体产品B类
class ConcreteProductB1 implements ProductB {
@Override
public void show() {
System.out.println("ConcreteProductB1");
}
}
class ConcreteProductB2 implements ProductB {
@Override
public void show() {
System.out.println("ConcreteProductB2");
}
}
//定义工厂接口
public interface AbstractFactory {
ProductA createProductA();
ProductB createProductB();
}
//定义具体工厂类
class ConcreteFactory1 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA1();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB1();
}
}
class ConcreteFactory2 implements AbstractFactory {
@Override
public ProductA createProductA() {
return new ConcreteProductA2();
}
@Override
public ProductB createProductB() {
return new ConcreteProductB2();
}
}
//使用
public class Main {
public static void main(String[] args) {
AbstractFactory factory = new ConcreteFactory1();
ProductA productA = factory.createProductA();
ProductB productB = factory.createProductB();
productA.show();
productB.show();
}
}
五、工厂模式在Android中的应用
在Android中,我们可以使用工厂模式来实现对象的创建和管理,比如在开发中,通过工厂方法来创建不同的Fragment、Adapter等,来动态满足不同需求。 以下是一个Android中使用工厂模式的示例:
//定义产品接口
public interface FragmentProduct {
Fragment create();
}
//定义具体产品类
class HomeFragmentProduct implements FragmentProduct {
@Override
public Fragment create() {
return new HomeFragment();
}
}
class MessageFragmentProduct implements FragmentProduct {
@Override
public Fragment create() {
return new MessageFragment();
}
}
//定义工厂类
public class FragmentFactory {
public static Fragment createFragment(int type) {
FragmentProduct product = null;
switch (type) {
case 0:
product = new HomeFragmentProduct();
break;
case 1:
product = new MessageFragmentProduct();
break;
}
if (product != null) {
return product.create();
} else {
return null;
}
}
}
//使用
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Fragment fragment = FragmentFactory.createFragment(0);
getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment).commit();
}
}