工厂模式
工厂模式分为简单工厂模式(静态工厂),工厂方法模式,抽象工厂模式三大类。
1.简单工厂模式
简单工厂模式又叫静态工厂模式,是指将new一个对象的操作交由工厂的静态方法来产生。这样做的目的是可以在new一个对象的时候来进行一些操作判断。
假如我们有一个Car类,然后某人想去开车,我们要判断其是否有驾照等。
public class Car {
public void drive(){
System.out.println("开车出发喽。。。");
}
}
正常情况下,一个人要是想开车,他就会直接new一个车。如下:
public class Main {
public static void main(String[] args) {
Car c=new Car();
c.drive();
}
}
这样即使该人没有驾照我们也不能阻止他new。但是我们用一个简单工厂方法就可以进行控制。
public class Factory {
public static Car getCar(){
//判断是否有驾照
return new Car();
}
}
这样我们在main方法里就直接可以调用 Factory.getCar()来获取一个Car对象。
如果我们想让他开摩托车,那我们要创建一个摩托类。并且在正常情况下要自己new一个摩托。我们交给工厂来做这些new的事情,我们不管他new的细节。
public class Moto {
public static void driveMoto(){
System.out.println("骑摩托出发了。。。。。");
}
}
这样的话 我们就得让car和moto实现一个接口。比如vehile接口。
public interface Vehicle {
void drive();
}
public class Car implements Vehicle{
public void drive(){
System.out.println("开车出发喽。。。");
}
}
public class Moto implements Vehicle {
public void drive() {
System.out.println("骑摩托出发了。。。。。");
}
}
public class Factory {
public static <T extends Vehicle> T getCar(Class<T> c){
//判断是否有驾照
Vehicle vehicle=null;
try {
vehicle=(Vehicle) Class.forName(c.getName()).newInstance();
} catch (InstantiationException | IllegalAccessException
| ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (T) vehicle;
}
}
public class Main {
public static void main(String[] args) {
Vehicle c= Factory.getCar(Car.class);
c.drive();
}
}
2.工厂方法模式
工厂方法模式和简单工厂模式很相似,只不过工厂方法模式需要继承一个抽象类,并且new出这个工厂。
public class Plane implements Vehicle{
public void drive(){
System.out.println("开飞机喽。。。。。。");
}
}
public abstract class AbstractFactory {
public abstract <T> Vehicle creat(Class<T> c);
}
public class Main {
public static void main(String[] args) {
AbstractFactory factory=new Factory();
Vehicle c= factory.creat(Car.class);
c.drive();
}
}
- ###### 多个工厂模式
上面的工厂方法模式,只有一个工厂来生产对象。但是如果初始化一个对象很费力,所有的产品类都放到一个工厂方法中进行初始化会使代码结构不清晰。举个例子,假如现在要生产一个飞机,那么生产汽车的工厂设备是不行的,所以我们就要用不同的工厂。
public class Plane implements Vehicle{
public void drive(){
System.out.println("开飞机喽。。。。。。");
}
}
public abstract class AbstractMultiFactory {
public abstract Vehicle creat();
}
public class PlaneFactory extends AbstractMultiFactory {
@Override
public Vehicle creat() {
return new Plane();
}
}
public class CarFactory extends AbstractMultiFactory {
@Override
public Vehicle creat() {
return new Car();
}
}
public class Main {
public static void main(String[] args) {
Vehicle plane= new PlaneFactory().creat();
plane.drive();
}
}
3.抽象工厂模式
抽象工厂模式主要应用于一个产品族。比如你穿的衣服和鞋子都是NIke的,但是你突然有一天想换成Adidas的,你又不想一件一件换,想一下就换成功,就和换主题一样,主题里面的所有东西都变了。
//nike鞋
public class NikeShoes {
public void getBrand(){
System.out.println("Nike shoes...");
}
}
//nike衬衫
public class NikeShirt {
public void getBrand(){
System.out.println("Nike shirt...");
}
}
public class NikeFactory {
public NikeShirt creatNikeShirt(){
return new NikeShirt();
}
public NikeShoes creatNikeShoes(){
return new NikeShoes();
}
}
上面的情况,如果我们要换成Adidas的,那我们就需要在工厂方法里进行更改。这样做并不好。所以我们采用如下的抽象工厂模式。我们让Nikeshire实现Shirt抽象类,让NikeShoes实现Shoes抽象类。并且建一个抽象工厂类,用来生产Shirt和Shoes。具体代码如下:
public interface Shoes {
public void getBrand();
}
public interface Shirt {
public void getBrand();
}
public class NikeShirt implements Shirt{
public void getBrand(){
System.out.println("Nike shirt...");
}
}
public class NikeShoes implements Shoes{
public void getBrand(){
System.out.println("Nike shoes...");
}
}
public abstract class Factory {
abstract Shirt creatShirt();
abstract Shoes creatShoes();
}
public class NikeFactory extends Factory {
@Override
Shirt creatShirt() {
// TODO Auto-generated method stub
return new NikeShirt();
}
@Override
Shoes creatShoes() {
// TODO Auto-generated method stub
return new NikeShoes();
}
}
public class Main {
public static void main(String[] args) {
Factory factory=new NikeFactory();
factory.creatShirt();
factory.creatShoes();
}
}
当我们要改为Adidas时,我们只需将工厂换为Adidas即可,不需改动其他代码。