【Java】抽象工厂模式

同样不是怎么高深的或者新的东西,只是一种编程方式,甚至可以说只是编程风格而已。

只是抽象工厂模式的编程风格得到广泛应用,你不了解一下,还真看不懂。

抽象工厂模式就是,多个抽象产品类,派生出多个具体产品类;一个抽象工厂类,派生出多个具体工厂类;每个具体工厂类可创建多个具体产品类的实例。即提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们的具体的类。“一对多”的关系。

举个例子还说明,就相当于一个奶茶店的老板,他要生产小杯奶茶、大杯奶茶、小杯咖啡、大杯咖啡给顾客,他的生产流程就生产奶茶、咖啡,然后再生成小杯、大杯,最后将两个过程最终合在一起就是产品,不是说这4样东西都是孤立的,他要修改小杯的尺寸,修改完后,就能够直接修改小杯奶茶、小杯咖啡,不会孤立地分别修改。

比如如下一段经典JAVA的代码,不同的厂商分别生产各自的手机。而这些手机都有共同的method接口,一目了然地可以发现,不同的method接口的实现是不一样的。

//定义不同的产品之间的一定具备的标准,用interface实现 
//其中的method()方法可看作提取出不同产品的共性,如手机都有类似的功能 
interface IProductA {
	public void method();
}

interface IProductB {
	public void method();
}

// 实现了产品标准实现的一系列具体产品
// 由于已经设计好A1由厂商1生产,故以下输出代码有“厂商x”
class ProductA1 implements IProductA {
	public void method() {
		System.out.println("厂商1    生产ProductA1 ...");
	}
}

class ProductA2 implements IProductA {
	public void method() {
		System.out.println("厂商2    生产ProductA2 ...");
	}
}

class ProductB1 implements IProductB {
	public void method() {
		System.out.println("厂商1    生产ProductB1 ...");
	}
}

class ProductB2 implements IProductB {
	public void method() {
		System.out.println("厂商2    生产ProductB2 ...");
	}
}

// 每一种牌子的产品生产工厂,即不同的厂商负责自己牌子产品的生产
abstract class Factory1 {
	abstract IProductA getProductA1();

	abstract IProductB getProductB1();
}

abstract class Factory2 {
	abstract IProductA getProductA2();

	abstract IProductB getProductB2();
}

// 具体的工厂用来生产相关的产品
class ConcreteFactory1 extends Factory1 {
	public IProductA getProductA1() {
		return new ProductA1();
	}

	public IProductB getProductB1() {
		return new ProductB1();
	}
}

class ConcreteFactoryB extends Factory2 {
	public IProductA getProductA2() {
		return new ProductA2();
	}

	public IProductB getProductB2() {
		return new ProductB2();
	}
}

// 测试类
public class Client {
	public static void main(String[] args) {
		// 厂商1负责生产产品A1、B1
		Factory1 factory1 = new ConcreteFactory1();
		IProductA productA1 = factory1.getProductA1();
		IProductB productB1 = factory1.getProductB1();

		productA1.method();
		productB1.method();

		// 厂商2负责生产产品A2、B2
		Factory2 factory2 = new ConcreteFactoryB();
		IProductA productA2 = factory2.getProductA2();
		IProductB productB2 = factory2.getProductB2();

		productA2.method();
		productB2.method();
	}
}

再用一道2012年下半年软件设计师的软考题来说明这个问题:

题目是这样的:现欲开发一个软件系统,要求能够同时支持多种不同的数据库,为此采用抽象工厂模式设计该系统,以SQL Server和Access两种数据库以及系统中的数据库表Department为例,其类图如图6-1所示:


具体的Java实现代码如下所示:

//创造、实现方法。
class Department {
	// 根据数据库中Department表所建立的实体类
}

interface IDepartment {
	public void Insert(Department department);

	public Department GetDepartment(int id);
}

class SqlServerDepartment implements IDepartment {

	@Override
	public void Insert(Department department) {
		System.out.println("插入Department到Sqlserver");
		// 实现插入Department到Sqlserver的代码
	}

	@Override
	public Department GetDepartment(int id) {
		System.out.println("得到Sqlserver的id为" + id + "的Department");
		// 实现从Sqlserver得到Department的代码
		return null;
	}

}

class AccessDepartment implements IDepartment {

	@Override
	public void Insert(Department department) {
		System.out.println("插入Department到Access");
		// 实现插入Department到Access的代码
	}

	@Override
	public Department GetDepartment(int id) {
		System.out.println("得到Access的id为" + id + "的Department");
		return null;
		// 实现从Access得到Department的代码
	}

}

// 创造类
interface IFactory {
	public IDepartment createDepartment();
}

class SqlServerFactory implements IFactory {

	@Override
	public IDepartment createDepartment() {
		return new SqlServerDepartment();
	}

}

class AccessFactory implements IFactory {

	@Override
	public IDepartment createDepartment() {
		return new AccessDepartment();
	}

}

public class AbstractFactoryTest {
	public static void main(String[] args) {
		Department department = new Department();
		SqlServerFactory sqlServerFactory = new SqlServerFactory();
		sqlServerFactory.createDepartment().Insert(department);
		sqlServerFactory.createDepartment().GetDepartment(1);
		AccessFactory accessFactory = new AccessFactory();
		accessFactory.createDepartment().Insert(department);
		accessFactory.createDepartment().GetDepartment(6);
	}

}

运行结果如下所示:


这个程序,是从下面看到上面的,可以看到主函数,只是实例化了工厂,你要搞Sql Server就新建Sql Server工厂,要搞Access就新建Access工厂,

之后无论是什么工厂利用其createDepartment()方法,建立相应类,具体看上面创建类的部分,

一个接口,同名方法createDepartment(),根据工厂的不同,实现方法是不同的,就是返回不同的类。相当于一开始例子中的“奶茶”还是“咖啡”

之后,再调用里面的Insert()方法与GetDepartment(),此两个方法的实现,见最上面的创造、实现方法部分。

不同的类里面,这两个方法的实现是不同的,相当于一开始例子中的“小杯奶茶”还是“大杯奶茶”,或者是“小杯咖啡”还是“大杯咖啡”。形成了1:2:4:n的关系。

然而主函数的实现是很清晰的。

### 回答1: Java抽象工厂模式(Abstract Factory Pattern)是一种创建型设计模式,它提供了一种将一组相关的工厂组合起来创建对象的方式,而不必指定具体的类。 抽象工厂模式通常涉及一个抽象工厂类,它声明了用于创建一组相关对象的抽象方法。每个具体的工厂类都实现了这些抽象方法,以便创建一组特定的对象。这些具体的工厂类通常在运行时通过依赖注入或配置文件等方式被选择和实例化。 在抽象工厂模式中,客户端代码只与抽象工厂类和抽象产品类交互。这使得客户端代码能够与特定实现细节分离,从而更加灵活和可维护。 以下是Java抽象工厂模式的简单示例: ```java // 抽象工厂类 public interface AbstractFactory { public ProductA createProductA(); public ProductB createProductB(); } // 具体工厂类 1 public class ConcreteFactory1 implements AbstractFactory { public ProductA createProductA() { return new ConcreteProductA1(); } public ProductB createProductB() { return new ConcreteProductB1(); } } // 具体工厂类 2 public class ConcreteFactory2 implements AbstractFactory { public ProductA createProductA() { return new ConcreteProductA2(); } public ProductB createProductB() { return new ConcreteProductB2(); } } // 抽象产品类 public interface ProductA { public void methodA(); } // 具体产品类 1 public class ConcreteProductA1 implements ProductA { public void methodA() { System.out.println("ConcreteProductA1's methodA"); } } // 具体产品类 2 public class ConcreteProductA2 implements ProductA { public void methodA() { System.out.println("ConcreteProductA2's methodA"); } } // 抽象产品类 public interface ProductB { public void methodB(); } // 具体产品类 1 public class ConcreteProductB1 implements ProductB { public void methodB() { System.out.println("ConcreteProductB1's methodB"); } } // 具体产品类 2 public class ConcreteProductB2 implements ProductB { public void methodB() { System.out.println("ConcreteProductB2's methodB"); } } ``` 在这个示例中,抽象工厂类(AbstractFactory)声明了创建ProductA和ProductB的抽象方法。具体工厂类1(ConcreteFactory1)和具体工厂类2(ConcreteFactory2)都实现了这些方法,以便分别创建ConcreteProductA1和ConcreteProductB1或ConcreteProductA2和ConcreteProductB2等具体产品类的实例。这些具体工厂类可以通过依赖注入或配置文件等方式被选择和实例化。 客户端代码只需要通过抽象工厂类来创建ProductA和ProductB的实例,无需关心 ### 回答2: 抽象工厂模式是一种创建型设计模式,它提供了一种将相关的对象组织起来创建的方法。在Java中,抽象工厂模式抽象工厂和具体工厂、抽象产品和具体产品组成。 抽象工厂一个接口或抽象类,它声明了一组创建产品的方法,这些方法可以返回抽象产品或产品族。具体工厂实现了抽象工厂接口,并实现了具体的产品创建方法。 抽象产品定义了产品的通用特性和行为,而具体产品则继承或实现了抽象产品,并提供了具体的实现。 通过使用抽象工厂模式,我们可以轻松地添加或替换整个产品族,而无需修改客户端代码。客户端只需要通过抽象工厂接口来创建产品,而不需要关心具体的产品或产品族。 以下是使用Java实现抽象工厂模式一个简单示例: ``` // 抽象产品A interface ProductA { void operationA(); } // 抽象产品B interface ProductB { void operationB(); } // 具体产品A1 class ConcreteProductA1 implements ProductA { @Override public void operationA() { System.out.println("ConcreteProductA1 operationA"); } } // 具体产品A2 class ConcreteProductA2 implements ProductA { @Override public void operationA() { System.out.println("ConcreteProductA2 operationA"); } } // 具体产品B1 class ConcreteProductB1 implements ProductB { @Override public void operationB() { System.out.println("ConcreteProductB1 operationB"); } } // 具体产品B2 class ConcreteProductB2 implements ProductB { @Override public void operationB() { System.out.println("ConcreteProductB2 operationB"); } } // 抽象工厂 interface AbstractFactory { ProductA createProductA(); ProductB createProductB(); } // 具体工厂1 class ConcreteFactory1 implements AbstractFactory { @Override public ProductA createProductA() { return new ConcreteProductA1(); } @Override public ProductB createProductB() { return new ConcreteProductB1(); } } // 具体工厂2 class ConcreteFactory2 implements AbstractFactory { @Override public ProductA createProductA() { return new ConcreteProductA2(); } @Override public ProductB createProductB() { return new ConcreteProductB2(); } } // 客户端代码 public class Client { public static void main(String[] args) { AbstractFactory factory = new ConcreteFactory1(); ProductA productA = factory.createProductA(); ProductB productB = factory.createProductB(); productA.operationA(); productB.operationB(); } } ``` 以上示例中,抽象工厂`AbstractFactory`定义了创建产品A和B的抽象方法。具体工厂`ConcreteFactory1`和`ConcreteFactory2`分别实现了抽象工厂接口,负责创建具体的产品A和B。具体的产品A和B都实现了对应的接口。在客户端代码中,我们可以通过切换具体工厂来创建不同的产品族,而无需修改客户端代码。 ### 回答3: 抽象工厂模式是一种创建型设计模式,它提供了一个抽象的工厂接口,用于创建一系列相关或依赖的对象,而无需指定其具体的类。通过使用该模式,我们可以将对象的创建和使用分离开来,提供更好的灵活性和可扩展性。 在Java中,抽象工厂模式通常由一个抽象工厂接口和多个具体工厂类来实现。抽象工厂接口定义了创建一系列产品对象的方法,而具体工厂类分别实现这些方法来创建具体的产品对象。 抽象工厂模式适用于需要创建一系列相关的产品对象的场景,例如创建不同类型的按钮和文本框组合。我们可以定义一个抽象按钮工厂接口和一个抽象文本框工厂接口,然后分别由多个具体按钮工厂类和文本框工厂类来实现这些接口。这样一来,当需要创建不同类型的按钮和文本框时,只需通过对应的工厂对象调用相应的方法即可,不需要关心具体的实现。 抽象工厂模式的优点是能够在不修改客户端代码的情况下引入新的产品系列,与客户端代码解耦。同时,它也能够保证所创建的对象是一致相关的,符合一定的规范。 然而,抽象工厂模式也存在一些缺点。由于每增加一个产品系列,就需要增加一个对应的具体工厂类,这样会使得系统的类的个数增加。同时,如果需要扩展产品对象的种类,就需要修改抽象工厂接口以及所有具体工厂类的实现,这样会对系统的扩展性造成一定的影响。 总的来说,抽象工厂模式在某些特定的场景下能够提供一种简便、灵活的对象创建方式,但同时也需要权衡其对系统复杂性和可扩展性的影响。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值