工厂模式旨在提供一种统一的接口来创建对象,而将具体的对象实例化的过程延迟到子类或者具体实现中。有助于降低客户端代码与被创建对象之间的耦合度,提高代码的灵活性和可维护性。
定义了一个创建对象的接口,但不负责具体对象的实例化。而是将实例化的责任交给它的子类或者具体实现,这种模式包括抽象工厂、工厂方法和简单工厂等不同形式。
简单工厂模式是工厂模式的一种简化形式,包含了一个具体工厂类,负责创建产品的对象。
// 抽象产品类
interface Product {
void display();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void display() {
System.out.println("Product A");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void display() {
System.out.println("Product B");
}
}
// 简单工厂类
class SimpleFactory {
public static Product createProduct(String type) {
switch (type) {
case "A":
return new ConcreteProductA();
case "B":
return new ConcreteProductB();
default:
throw new IllegalArgumentException("Invalid product type");
}
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Product productA = SimpleFactory.createProduct("A");
productA.display(); // Output: Product A
Product productB = SimpleFactory.createProduct("B");
productB.display(); // Output: Product B
}
}
工厂方法模式定义了一个创建产品的接口,具体的产品创建由其子类负责实现。
// 抽象产品类
interface Product {
void display();
}
// 具体产品类A
class ConcreteProductA implements Product {
@Override
public void display() {
System.out.println("Product A");
}
}
// 具体产品类B
class ConcreteProductB implements Product {
@Override
public void display() {
System.out.println("Product B");
}
}
// 抽象工厂接口
interface Factory {
Product createProduct();
}
// 具体工厂类A
class ConcreteFactoryA implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductA();
}
}
// 具体工厂类B
class ConcreteFactoryB implements Factory {
@Override
public Product createProduct() {
return new ConcreteProductB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
Factory factoryA = new ConcreteFactoryA();
Product productA = factoryA.createProduct();
productA.display(); // Output: Product A
Factory factoryB = new ConcreteFactoryB();
Product productB = factoryB.createProduct();
productB.display(); // Output: Product B
}
}
通过以上缓解措施,可以在一定程度上提高工厂模式的灵活性和可维护性,使其更好地适应变化。在实际应用中,根据具体场景选择合适的工厂的模式,并结合其他设计模式,以达到代码的清晰和可扩展。
抽象工厂模式提供了一个接口,用于创建与产品家族相关的对象,无需制定具体类,有助于确保创建的对象能够相互配合使用,而无需指定具体的类。
抽象工厂模式提供了一种将一组相关的产品组合成一个家族的方式,而不必指定具体的类,通过引入抽象工厂接口和一组具体工厂类,为每个产品提供一个独立的工厂,从而使系统更具灵活性。
示例:图形界面库的抽象工厂模式,包含图形界面库中的按钮和文本框。
// 抽象按钮接口
interface Button {
void display();
}
// 具体按钮A
class ButtonA implements Button {
@Override
public void display() {
System.out.println("Button A");
}
}
// 具体按钮B
class ButtonB implements Button {
@Override
public void display() {
System.out.println("Button B");
}
}
// 抽象文本框接口
interface TextBox {
void display();
}
// 具体文本框A
class TextBoxA implements TextBox {
@Override
public void display() {
System.out.println("TextBox A");
}
}
// 具体文本框B
class TextBoxB implements TextBox {
@Override
public void display() {
System.out.println("TextBox B");
}
}
// 抽象工厂接口
interface GUIFactory {
Button createButton();
TextBox createTextBox();
}
// 具体工厂A
class GUIFactoryA implements GUIFactory {
@Override
public Button createButton() {
return new ButtonA();
}
@Override
public TextBox createTextBox() {
return new TextBoxA();
}
}
// 具体工厂B
class GUIFactoryB implements GUIFactory {
@Override
public Button createButton() {
return new ButtonB();
}
@Override
public TextBox createTextBox() {
return new TextBoxB();
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 使用工厂A创建按钮和文本框
GUIFactory factoryA = new GUIFactoryA();
Button buttonA = factoryA.createButton();
TextBox textBoxA = factoryA.createTextBox();
buttonA.display(); // Output: Button A
textBoxA.display(); // Output: TextBox A
// 使用工厂B创建按钮和文本框
GUIFactory factoryB = new GUIFactoryB();
Button buttonB = factoryB.createButton();
TextBox textBoxB = factoryB.createTextBox();
buttonB.display(); // Output: Button B
textBoxB.display(); // Output: TextBox B
}
}
建造者模式旨在通过将复杂对象的构造过程分离成多个简单的步骤,使得同样的创建过程可以创建不同的表示,有助于客户端代码能够根据需求选择构建过程的不同组合,以创建不同属性的对象。
将一个复杂对象的构建与其表示分离,使得同样的创建过程可以创建不同的表示,主要包含以下角色:
设计实现一个电脑组装的建造者模式
// 产品类
class Computer {
private String cpu;
private String memory;
private String storage;
public Computer(String cpu, String memory, String storage) {
this.cpu = cpu;
this.memory = memory;
this.storage = storage;
}
// Getters...
public void display() {
System.out.println("Computer Specs: CPU-" + cpu + ", Memory-" + memory + ", Storage-" + storage);
}
}
// 抽象建造者
interface ComputerBuilder {
void buildCPU(String cpu);
void buildMemory(String memory);
void buildStorage(String storage);
Computer getResult();
}
// 具体建造者A
class ConcreteBuilderA implements ComputerBuilder {
private Computer computer;
public ConcreteBuilderA() {
this.computer = new Computer("", "", "");
}
@Override
public void buildCPU(String cpu) {
computer = new Computer(cpu, computer.getMemory(), computer.getStorage());
}
@Override
public void buildMemory(String memory) {
computer = new Computer(computer.getCpu(), memory, computer.getStorage());
}
@Override
public void buildStorage(String storage) {
computer = new Computer(computer.getCpu(), computer.getMemory(), storage);
}
@Override
public Computer getResult() {
return computer;
}
}
// 具体建造者B
class ConcreteBuilderB implements ComputerBuilder {
private Computer computer;
public ConcreteBuilderB() {
this.computer = new Computer("", "", "");
}
@Override
public void buildCPU(String cpu) {
computer = new Computer(cpu, computer.getMemory(), computer.getStorage());
}
@Override
public void buildMemory(String memory) {
computer = new Computer(computer.getCpu(), memory, computer.getStorage());
}
@Override
public void buildStorage(String storage) {
computer = new Computer(computer.getCpu(), computer.getMemory(), storage);
}
@Override
public Computer getResult() {
return computer;
}
}
// 指挥者
class Director {
public void construct(ComputerBuilder builder) {
builder.buildCPU("Intel i5");
builder.buildMemory("8GB");
builder.buildStorage("256GB SSD");
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
// 使用建造者A构建电脑
ComputerBuilder builderA = new ConcreteBuilderA();
Director director = new Director();
director.construct(builderA);
Computer computerA = builderA.getResult();
computerA.display();
// 使用建造者B构建电脑
ComputerBuilder builderB = new ConcreteBuilderB();
director.construct(builderB);
Computer computerB = builderB.getResult();
computerB.display();
}
}