工厂模式和抽象工厂概述以及二者的区别
工厂模式
什么是工厂模式
顾名思义,工厂模式就是一种生产产品的模式,我们这里的产品就是各种各样的对象
工厂模式的类图
如图所示:
1.我们有一个抽象类,工厂,两个具体实现,NYstore和Bstore,实现了抽象工厂的几个方法
2.我们有一种产品,pizza,并且对于它我们有很多实现,分为ny系和b系,不过他们都是pizza
当我们需要pizza的时候,我们只要用一个store对象的创建方法来点餐就可以了,工厂类会根据其类型的不同创建相应的pizza给我们吃。
调用代码:
public class FactoryDriver {
public static void main(String[] args){
PizzaStore nystore = new NYStore();//创建store
PizzaStore shstore = new SHStore();//创建另一个store
Pizza shchess = shstore.createPizza("chess");//点一个chess pizza
System.out.println(shchess.getName());//我们发现,在sh点的chess是上海风味!
Pizza nychess = nystore.createPizza("chess");
System.out.println(nychess.getName());//我们发现,在ny点的chess是纽约风味!
}
}
抽象工厂
什么是抽象工厂
简单的说,抽象工厂就是加强的工厂模式,工厂模式只能生成一种产品,比如披萨工厂只能生成披萨,然而,我们的抽象工厂,可以生产
全家桶!薯条,可乐,鸡腿,煎饼果子,这些都能生产!
抽象工厂的类图
1.如图所示,我们的thingfactory定义了几个创建方法,可以让我们生产特定的套餐,里面包含thing1,thing2,thing3,可以是啤酒,薯条,鸡腿
2.然后我们的两个具体类来实现了生产这个套餐的过程,左边的啤酒,薯条,鸡腿又分成了两派
3.我们的具体工厂是怎么生产啤酒,薯条,鸡腿呢?我们的北京商店有可能提供,北京特产咖啡味啤酒,北京特产红酒味啤酒,当然要用我们上面说的工厂方法!
怎么使用抽象工厂呢?看代码!
Factory
public class HKFactory implements PizzaIngredientFactory {
@Override
public Dough createDough() {
return new HKDough();
}
@Override
public Sauce createSauce() {
return new HKSauce();
}
}
HKPizza
public class HKpizza extends Pizza {
PizzaIngredientFactory factory;
Sauce sauce;
Dough dough;
public HKpizza(PizzaIngredientFactory factory){
this.factory = factory;
this.sauce = factory.createSauce();
this.dough = factory.createDough();
}//我们的pizza现在是一个组合套餐了,里面有好几个成员
}
HKStore
public class HKStore implements Store{
PizzaIngredientFactory factory = new HKFactory();
@Override
public Pizza orderPizza(String name) {
if (name.equals("pizza"))
return new HKpizza(factory);
else
return null;
}
}
Driver
//最外层还是跟我们的工厂方法一样
public class Driver {
public static void main(String[] args){
Store hkstore = new HKStore();
Store nystore = new NYStore();
Pizza pizza = hkstore.orderPizza("HKpizza");
Pizza pizza1 = nystore.orderPizza("NYpizza");
}
}
抽象工厂和工厂的同异
相同点
1.都是生产对象的方法
2.都把使用者和具体类型解绑了
3.抽象工厂生产套餐的具体元素的时候经常使用工厂方法(比如生产套餐里的可乐的时候,用了可乐工厂来根据不同地区生产不同可乐),再把他们组合起来,形成套餐
不同点
1.创建方式不同,工厂创建一个新对象使用的是继承现有工厂类然后复写工厂方法,而抽象工厂是使用了类的组合
2.针对的对象不同,工厂方法主要针对是一种产品,比如,可乐,薯条其中的一种,而抽象工厂却是针对一系列产品,比如薯条和可乐的组合套餐,也可以称之为产品族
3.1当需要新增一种产品的时候,在工厂方法中,我们只需要增加一种产品实例,并在具体工厂中加入生产这种实例的判断条件就可以了。
3.2在抽象工厂中新增一个元素(比如在现有套餐中加送一块鸡腿),我们需要改工厂接口,新增这个鸡腿的接口,并修改这个接口的实现,新增这个方法并实现,在这个实现里来创建这个赠送的鸡腿