工厂模式例子

工厂模式(Factory Pattern):

在工厂模式中,这3个名词容易被混淆:简单工厂模式,工厂方法模式,抽象工厂模式


简单工厂模式:

- 将变化部分抽出,保存在新的对象中,这个负责生产的对象即工厂。

- 简单工厂模式其实不是一个设计模式,更像是一种编程习惯。

例子:

1、工厂客户(披萨店):

public class PizzaShop {

	SimplePizzaFactory factory;
	
	public PizzaShop(SimplePizzaFactory factory){
		this.factory = factory;
	}
	
	Pizza orderPizza(String type){
		Pizza pizza;
		pizza = factory.createPizza(type);
		pizza.prepare();
		pizza.bake();
		...
		return pizza;
	}
	
}

2:工厂

public class PizzaShop {

	SimplePizzaFactory factory;
	
	public PizzaShop(SimplePizzaFactory factory){
		this.factory = factory;
	}
	
	Pizza orderPizza(String type){
		Pizza pizza;
		pizza = factory.createPizza(type);
		pizza.prepare();
		pizza.bake();
		...
		return pizza;
	}
	
}


3,示例图:



工厂方法模式:

定义:

定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。


功能:

通过工厂模式,我们的代码完全与实现分离,既可动态,透明的将某个实现替换为另一个实现。


例子:

创建者类:

public abstract class PizzaShop {

	Pizza orderPizza(String type){
		Pizza pizza;
		pizza = createPizza(type);
		pizza.prepare();
		pizza.bake();
		...
		return pizza;
	}
	
	protected abstract Pizza createPizza(String type);
}

创建者实现:

public class ChicagoPizzaStore extends PizzaShop {

	@Override
	protected Pizza createPizza(String type) {
		Pizza pizza;
		...
		return pizza;
	}

}


public class NYPizzaStore extends PizzaShop {

	@Override
	protected Pizza createPizza(String type) {
		Pizza pizza;
		...
		return pizza;
	}

}

产品类:

public abstract class Pizza {
	
	String name;
	String dough;
	
	void prepare(){
		...;
	}
	
	void bake(){
		
	}
	
	...
	
}

产品类实现:
public class NYStyleCheesePizza extends Pizza {

	public NYStyleCheesePizza(){
		name = "NYStyle";
	}
	
}

public class ChicagoStyleCheesePizza extends Pizza {

	public ChicagoStyleCheesePizza(){
		name = "Chicago Style";
	}
	
	void cut(){
		// Chicago style cut
	}
	
}


抽象工厂模式

定义:

提供一个借口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。


例子:

工厂对象接口:

public interface Cycle {
	
	void ride();
	
}

工厂接口:

public interface CycleFactory {
	
	Cycle getCycle();
	
}

实现类:

这里例子是双轮车与单轮车,双轮车:

public class Bicycle implements Cycle {

	public void ride() {
		System.out.println("Bicycle is riding!");
	}

}

public class BicycleFactory implements CycleFactory {

	public Cycle getCycle() {
		return new Bicycle();
	}
	
}

单轮车:

public class Unicycle implements Cycle {

	public void ride() {
		System.out.println("Unicycle is riding !");
	}

}

public class UnicycleFactory implements CycleFactory{

	public Cycle getCycle() {
		return new Unicycle();
	}

}

主函数:

public class main {
	
	
	static void run(CycleFactory factory){
		factory.getCycle().ride();
	}
	
	
	public static void main(String args[]){
		run(new BicycleFactory());
		run(new UnicycleFactory());
		run(new TricycleFactory());
	}
}

优点:

- 能从具体的产品中被解耦。

- 可以把一群相关的产品集合起来。

缺点:

- 如果扩展这组产品,就需要改变接口,导致大量的修改。


总结:

对于创建类,任何时候都可以替代为创建一个借口和一个工厂。但如果为了抽象而抽象,那实际上是一种草率的设计优化。

任何抽象性都应该是应真正需求而产生的。当必须时,应该重构接口而不是到处添加额外的间接性,并由此带来额外的复杂性。

恰当的原则应该优先选择类而不是接口。

从类开始,如果接口的必须行变得非常明确,那么就进行重构。接口是一种重要的工具,但是他们容易被滥用。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java工厂模式是一种创建对象的设计模式,它供了一种将对象的创建与使用分离的方式。工厂模式通过使用工厂类来创建对象,而不是直接在代码中实例化对象。这样可以提高代码的灵活性和可维护性。 下面是一个Java工厂模式例子[^1]: 1. 创建一个工厂接口`MathFactoryInterface`,该接口定义了一个方法`getOperation`,用于根据操作符返回相应的数学操作对象。 ```java import java.util.Optional; public interface MathFactoryInterface { Optional<MathOperation> getOperation(String operator); } ``` 2. 创建一个数学操作接口`MathOperation`,该接口定义了一个方法`apply`,用于执行数学操作。 ```java public interface MathOperation { double apply(double first, double second); } ``` 3. 创建具体的数学操作类,实现`MathOperation`接口。 ```java public class AdditionOperation implements MathOperation { @Override public double apply(double first, double second) { return first + second; } } public class SubtractionOperation implements MathOperation { @Override public double apply(double first, double second) { return first - second; } } // 其他数学操作类... ``` 4. 创建一个工厂类`MathFactory`,实现`MathFactoryInterface`接口,根据操作符返回相应的数学操作对象。 ```java import java.util.HashMap; import java.util.Map; import java.util.Optional; public class MathFactory implements MathFactoryInterface { private Map<String, MathOperation> operationMap; public MathFactory() { operationMap = new HashMap<>(); operationMap.put("+", new AdditionOperation()); operationMap.put("-", new SubtractionOperation()); // 添加其他数学操作对象... } @Override public Optional<MathOperation> getOperation(String operator) { return Optional.ofNullable(operationMap.get(operator)); } } ``` 5. 在使用工厂模式的代码中,通过工厂类获取相应的数学操作对象,并执行相应的操作。 ```java double result; MathFactoryInterface factory = new MathFactory(); MathOperation operation = factory.getOperation("+").orElseThrow(() -> new IllegalArgumentException("未知的操作")); result = operation.apply(10, 5); System.out.println(result); // 输出:15.0 ``` 这个例子中,我们通过工厂模式将数学操作的创建与使用分离,通过工厂类`MathFactory`根据操作符返回相应的数学操作对象,然后执行相应的操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值