书上举的例子是:对于不同类型的Pizza,怎么实例化该类型的Pizza,首先使用的是简单工厂,书上说着其实不是一种设计模式,只是一种编程习惯,简单工厂并不复杂,一看就懂,只不过原来我们可能吧所以的方法融合在一个类中,现在简单工厂是将生产工厂的方法独立在一个类中。
1.我们先看抽象出来的Pizza类
package simplefactory;
public class Pizza {
String name;
String dough;
public String getDough(){
return dough;
}
public String getName(){
return name;
}
public void prepare() {
System.out.println("Preparing " + name);
}
public void bake() {
System.out.println("Baking " + name);
}
public void cut() {
System.out.println("Cutting " + name);
}
public void box() {
System.out.println("Boxing " + name);
}
}
2.Pizza类的具体产品
package simplefactory;
public class CheesePizza extends Pizza {
public CheesePizza() {
name = "Cheese Pizza";
dough = "Regular Crust";
}
}
3.简单工厂类,其中ClamPizza和CheesePizza实现一样package simplefactory;
public class SimplePizzaFactory {
public Pizza cretePizza(String type){
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
}
else if(type.equals("clam")){
pizza = new ClamPizza();
}
return pizza;
}
}
4.工厂的“客户”,其实感觉和策略模式的上下文类Context一样,此处是为了通过工厂取得Pizza实例package simplefactory;
public class SimplePizzaFactory {
public Pizza cretePizza(String type){
Pizza pizza = null;
if (type.equals("cheese")) {
pizza = new CheesePizza();
}
else if(type.equals("clam")){
pizza = new ClamPizza();
}
return pizza;
}
}
5.测试类
package simplefactory;
public class Test {
public static void main(String[] args) {
SimplePizzaFactory factory = new SimplePizzaFactory();
PizzaStore store = new PizzaStore(factory);
Pizza pizza = store.orderPizza("cheese");
System.out.println("We ordered a " + pizza.getName() + "\n");
pizza = store.orderPizza("clam");
System.out.println("We ordered a " + pizza.getName() + "\n");
}
}
有了简单工厂的模式,我们就可以改写策略模式中,让工厂来实现具体的算法类
package mystrategy;
public class ContextFactory {
public Promotion createPromotion(String type){
Promotion promotion = null;
if (type.equals("full")) {
promotion = new FullPrice();
} else if(type.equals("discount")){
promotion = new DiscountPrice();
}else if (type.equals("return")) {
promotion = new ReturnPrice();
}
return promotion;
}
}
测试代码ContextFactory factory = new ContextFactory();
System.out.print("使用折扣价");
Promotion promotion = factory.createPromotion("discount");
money = promotion.discount(400);
System.out.println(money);
也可以利用静态方法定义一个简单的工厂,被称为静态工厂,所以不需要创建对象的方法来实例化对象,但是缺点是不能通过继承改变创建方法的行为。
简单工厂的应用,在spring中BeanFactory.getBean(String beanName)通过配置文件传入Bean的id时,然后通过id反射实例化不同的bean其实就是一个简单工厂。
如果文章有什么错误或者有什么建议,欢迎提出,大家共同交流,一起进步
文章转载请注明出处,请尊重知识产权