一 简介
1.1 叙述
1)在Java当中,万物皆为对象,这些对象都需要创建,如果创建的时候直接new该对象,就会对该对象耦合严重。假如我们需要更换对象,所有new对象的地方都需要修改一遍,这显然是违背了软件设计的开闭原则。
2)如果我们使用工厂来生产该对象,那么我们就只要和工厂打交道就可以了。彻底和对象进行解耦,如果需要更换对象,那么直接在工厂里面更换该对象即可。达到了与对象解耦的目的,所以说,工厂模式的最大优点就是:解耦。
1.2 三种模式
这里会介绍三种工厂模式:
1)简单工厂模式(这个不属于23种设计模式里面)
2)工厂方法模式
3)抽象工厂模式
二 简单工厂模式
简单工厂不是一种设计模式,反而比较像是一种编程习惯。
这种写法,在新增了产品的时候,有两步:
1、新增一个产品实现类,实现接口。
2、修改工厂类,在决定生产产品的方法上修改代码,增加生产该产品的条件
Coffee(产品,接口)
public interface Coffee {
String getName();
}
AmericanCoffee(具体的产品,类)
public class AmericaCoffee implements Coffee {
@Override
public String getName() {
return "America Coffee";
}
}
CoffeeFactory(创建者,类)
public class CoffeeFactory {
public static Coffee makeCoffee(int type) {
if (type == 1) {
return new AmericaCoffee();
} else if (type == 2) {
return new ChinaCoffee();
} else {
throw new RuntimeException("error");
}
}
public static void main(String[] args) {
Coffee coffee = CoffeeFactory.makeCoffee(1);
System.out.println(coffee.getName());
}
}
在开发中将工厂类中的创建对象的功能方法定义为静态的,这就是静态工厂模式,这个也不属于23种设计模式里面的。
三 工厂方法模式
1)简单工厂模式它也违背了开闭原则, 如果我们需要新增Coffee的种类的话,那么我们还是需要修改工厂类CoffeeFactory这个类
2)我们对上一种简单工厂模式进行修改,因为在扩展其他品种的Coffee时,需要修改CoffeFacoty这个类,那么我们就可以将CoffeeFactory这个类设置为抽象类,然后取每一种Coffee一种Factory,这样子在扩展其他品种的时候,只需要新增两个类,一个Coffee类,一个Coffee对应的Factory类。CoffeeFactory
public interface CoffeFactory {
public Coffee createCoffee();
}
LatteCoffee
public class LatteCoffeeFactory implements CoffeFactory {
@Override
public Coffee createCoffee() {
return new LatteCoffee();
}
}
CoffeStore
public class CoffeStore {
private CoffeFactory factory;
// 设置Coffee工厂
public void setFactory(CoffeFactory factory) {
this.factory = factory;
}
public Coffee orderCoffee() {
Coffee coffee = this.factory.createCoffee();
return coffee;
}
}
工厂方法的优缺点
1)优点:用户只需要知道具体工厂的名称就可以得到所需要的产品,无需要知道产品的创建过程
- 在系统增加新的产品的时候,只需要添加具体产品类和对应的具体工厂类,无需要对原工厂进行修改,满足开闭原则
2)缺点
- 每增加一个产品就需要增加一个产品类和一个对应的具体工厂类,这增加了系统的复杂度。
四 抽象工厂模式
1)前面的工厂模式都只考虑生产一种产品,如果Coffee工厂只生产Coffee,Tea工厂只生产Tea。
2)也就是说工厂方法模式只考虑生产同一种产品。但是在现实中,工厂一般是综合性的工厂,可以生产很多种类的产品。
3)抽象工厂模式将解决这个问题,将考虑到生产多等级的产品。
抽象工厂模式一般涉及的类比较多,这里就放在一个代码块中展示
// coffee接口
public interface Coffee {
String getCoffeeName();
}
// 具体需要生产的coffee
public class LatteCoffee implements Coffee {
@Override
public String getCoffeeName() {
return "Latte coffee";
}
}
public class AmericaCoffee implements Coffee {
@Override
public String getCoffeeName() {
return "america coffee";
}
}
// coffee工厂
public interface CoffeeFactory {
Coffee makeCoffee();
}
// 生产具体coffee的工厂
public class LatteCoffeeFactory implements CoffeeFactory{
@Override
public Coffee makeCoffee() {
return new LatteCoffee();
}
}
// milk接口
public interface Milk {
String MilkName();
}
// 需要生产的具体的milk
public class MengNiuMilk implements Milk {
@Override
public String MilkName() {
return "MengNiu milk";
}
}
public class YiliMilk implements Milk {
@Override
public String MilkName() {
return "yili milk";
}
}
// milk工厂
public interface MilkFactory {
Milk makeMilk();
}
// 生产具体的milk的工厂
public class MengNiuMilkFactory implements MilkFactory{
@Override
public Milk makeMilk() {
return new MengNiuMilk();
}
}
// 超级工厂,成产milk,coffee
public class SuperFactory {
private CoffeeFactory coffeeFactory;
private MilkFactory milkFactory;
public Coffee makeCoffee() {
return coffeeFactory.makeCoffee();
}
public Milk makeMilk() {
return milkFactory.makeMilk();
}
public static void main(String[] args) {
SuperFactory superFactory = new SuperFactory();
superFactory.setCoffeeFactory(new LatteCoffeeFactory());
superFactory.setMilkFactory(new MengNiuMilkFactory());
Coffee coffee = superFactory.makeCoffee();
System.out.println(coffee.getCoffeeName());
Milk milk = superFactory.makeMilk();
System.out.println(milk.MilkName());
}
}