工厂模式
简单工厂模式
简单工厂包含如下角色:
- 抽象产品 :定义了产品的规范,描述了产品的主要特性和功能。
- 具体产品 :实现或者继承抽象产品的子类
- 具体工厂 :提供了创建产品的方法,调用者通过该方法来获取产品。
抽象产品咖啡
public abstract class Coffee {
public abstract void getName();
public Coffee() {
System.out.println("点了杯咖啡");
}
}
咖啡的具体产品
public class BCoffee extends Coffee{
@Override
public void getName() {
System.out.println("拿铁");
}
}
public class ACoffee extends Coffee{
@Override
public void getName() {
System.out.println("美式");
}
}
具体工厂
public class CoffeeFactory {
public static Coffee orderCoffee(String type) {
Coffee coffee = null;
if(type.equals("a")){
coffee = new ACoffee();
}else {
coffee = new BCoffee();
}
return coffee;
}
}
工厂模式
工厂方法模式的主要角色:
-
抽象工厂(
Abstract Factory
):提供了创建产品的接口,调用者通过它访问具体工厂的工厂方法来创建产品。 -
具体工厂(
ConcreteFactory
):主要是实现抽象工厂中的抽象方法,完成具体产品的创建。
抽象产品(Product
):定义了产品的规范,描述了产品的主要特性和功能。 -
具体产品(
ConcreteProduct
):实现了抽象产品角色所定义的接口,由具体工厂来创建,它同具体工厂之间一一对应。
抽象产品
public abstract class Coffee {
public abstract void getName();
public Coffee() {
System.out.println("点了杯咖啡");
}
}
产品的实现类
public class ACoffee extends Coffee {
@Override
public void getName() {
System.out.println("美式");
}
}
public class BCoffee extends Coffee {
@Override
public void getName() {
System.out.println("拿铁");
}
}
抽象工厂
public interface CoffeeFactory {
Coffee createCoffee();
}
不同产品的工厂实现类
public class ACoffeeFactory implements CoffeeFactory{
@Override
public Coffee createCoffee() {
System.out.println("美式");
return new ACoffee();
}
}
public class BCoffeeFactory implements CoffeeFactory{
@Override
public Coffee createCoffee() {
System.out.println("拿铁");
return new BCoffee();
}
}
使用
public class CoffeeStore {
private CoffeeFactory coffeeFactory;
public void setCoffeeFactory(CoffeeFactory coffeeFactory){
this.coffeeFactory = coffeeFactory;
}
public Coffee orderCoffee(){
Coffee coffee = coffeeFactory.createCoffee();
return coffee;
}
}
测试类
public static void main(String[] args) {
CoffeeStore coffeeStore = new CoffeeStore();
CoffeeFactory aCoffeeFactory = new ACoffeeFactory();
coffeeStore.setCoffeeFactory(aCoffeeFactory);
coffeeStore.orderCoffee();
}
优点:
- 用户只需要知道具体工厂的名称就可得到所要的产品,无须知道产品的具体创建过程;
- 在系统增加新的产品时只需要添加具体产品类和对应的具体工厂类,无须对原工厂进行任何修改,满足开闭原则;
缺点:
- 每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类,这增加了系统的复杂度。
抽象工厂
是一种为访问类提供一个创建一组相关或相互依赖对象的接口,且访问类无须指定所要产品的具体类就能得到同族的不同等级的产品的模式结构。
抽象工厂模式是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品。
结构:
抽象工厂模式的主要角色如下:
- 抽象工厂(
Abstract Factory
):提供了创建产品的接口,它包含多个创建产品的方法,可以创建多个不同等级的产品。 - 具体工厂(
Concrete Factory
):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。 - 抽象产品(
Product
):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。 - 具体产品(
ConcreteProduct
):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间是多对一的关系。
抽象工厂:
public interface DessertFactory {
// 生产咖啡的功能
Coffee createCoffee();
// 生产甜品的功能
Dessert createDessert();
}
具体工厂:
public class ADessertFactory implements DessertFactory{
@Override
public Coffee createCoffee() {
return new ACoffee();
}
@Override
public Dessert createDessert() {
return new MatchaMousse();
}
}
public class BDessertFactory implements DessertFactory{
@Override
public Coffee createCoffee() {
return new BCoffee();
}
@Override
public Dessert createDessert() {
return new Trimisu();
}
}
抽象产品:
public abstract class Dessert {
public abstract void show();
}
public abstract class Coffee {
public abstract void getName();
public Coffee() {
System.out.println("点了杯咖啡");
}
}
具体产品
public class ACoffee extends Coffee {
@Override
public void getName() {
System.out.println("美式");
}
}
public class BCoffee extends Coffee {
@Override
public void getName() {
System.out.println("拿铁");
}
}
public class MatchaMousse extends Dessert{
@Override
public void show() {
System.out.println("抹茶慕斯");
}
}
public class Trimisu extends Dessert{
@Override
public void show() {
System.out.println("提拉米苏");
}
}
测试类
public static void main(String[] args) {
//ADessertFactory factory = new ADessertFactory();
BDessertFactory factory = new BDessertFactory();
Dessert dessert = factory.createDessert();
Coffee coffee = factory.createCoffee();
System.out.println(dessert);
System.out.println(coffee);
}
优点:
当一个产品族中的多个对象被设计成一起工作时,它能保证客户端始终只使用同一个产品族中的对象。
缺点:
当产品族中需要增加一个新的产品时,所有的工厂类都需要进行修改。
使用场景
-
当需要创建的对象是一系列相互关联或相互依赖的产品族时,如电器工厂中的电视机、洗衣机、空调等。
-
系统中有多个产品族,但每次只使用其中的某一族产品。如有人只喜欢穿某一个品牌的衣服和鞋。
-
系统中提供了产品的类库,且所有产品的接口相同,客户端不依赖产品实例的创建细节和内部结构。
如:输入法换皮肤,一整套一起换。生成不同操作系统的程序。