当前位置: 代码迷 >> 综合 >> java设计模式 ——工厂模式
  详细解决方案

java设计模式 ——工厂模式

热度:70   发布时间:2023-10-19 16:55:29.0

工厂模式一般可分为三类:简单工厂模式、抽象工厂模式、工厂方法模式。其中,简单工厂其实不是一个设计模式,反而比较像一种编程习惯。

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

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

抽象工厂创建的是一个产品家族,它的方法经常以工厂方法的方式实现。


简单工厂模式

用一个"工厂”类来处理创建对象的细节,实际使用时通过该“工厂”类的方法获取实例。

产品

public interface Pizza {void prepare();
}

public class VeggiePizza implements Pizza {public void prepare() {System.out.println("VeggiePizza prepare");}}

public class CheesePizza implements Pizza {public 	void prepare() {System.out.println("CheesePizza prepare");}
}

简单工厂类

public class SimplePizzaFactory {public Pizza createPizza(String type) {Pizza pizza = null;if(type.equals("CheesePizza")) {pizza = new CheesePizza();} else if(type.equals("VeggiePizza")) {pizza = new VeggiePizza();}return pizza;}
}
通过简单工厂获取实例
public class PizzaStore {SimplePizzaFactory factory;public PizzaStore(SimplePizzaFactory factory) {this.factory = factory;}public Pizza orderPizza(String type) {Pizza pizza = factory.createPizza(type);pizza.prepare();return pizza;}
}

工厂方法模式

不再由一个对象负责所有具体类的实例化,而是将工厂方法设置成”抽象“的,由抽象工厂的子类来负责具体类的实例化。

产品

public abstract class Pizza {private String name;abstract void prepare();public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public class CheesePizza extends Pizza {public CheesePizza() {this.setName("CheesePizza");}public 	void prepare() {System.out.println("CheesePizza prepare");}
}
public class VeggiePizza extends Pizza {public VeggiePizza() {this.setName("VeggiePizza");}public void prepare() {System.out.println("VeggiePizza prepare");}
}

工厂

//工厂方法模式
public abstract class PizzaStore {public Pizza orderPizza(String type) {//调用实例化产品类的抽象方法Pizza pizza = createPizza(type);pizza.prepare();return pizza;}//用工厂方法创建对象,由子类来负责实例化abstract Pizza createPizza(String type);
}

public class NYStylePizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;if(type.equals("CheesePizza")) {pizza = new CheesePizza();} else if(type.equals("VeggiePizza")) {pizza = new VeggiePizza();}return pizza;}}
public class ChicagoStylePizzaStore extends PizzaStore {Pizza createPizza(String type) {Pizza pizza = null;if(type.equals("CheesePizza")) {pizza = new CheesePizza();} else if(type.equals("VeggiePizza")) {pizza = new VeggiePizza();}return pizza;}
}

测试

public class Test {public static void main(String[] args) {NYStylePizzaStore store = new NYStylePizzaStore();Pizza pizza = store.orderPizza("CheesePizza");System.out.println("Pizza: " + pizza.getName());}
}
输出
CheesePizza prepare
Pizza: CheesePizza


抽象工厂模式

先为工厂定义一个接口,然后具体工厂实现该接口。

工厂

public interface PizzaIngredientFactory {public Dough createDough();public Sauce createSauce();//....
}

public class NYPizzaIngredientFactory implements PizzaIngredientFactory {public Dough createDough() {return new ThinCrustDough();}public Sauce createSauce() {return new MarinaraSauce();}
}

参考:《Head First 设计模式》