工厂模式

一、概述

1.目标:要控制任意类型交通工具的生产模式

2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多态

二、类结构

1.Interface Movable.java

2.Car.java

3.Plane.java

4.Interface VehicleFactory.java

5.CarFactory.java

6.PlaneFactory.java

意图 :定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行

关键代码:创建过程在其子类执行
应用实例:1.你需要一辆汽车,你可以直接从工厂里面提货,而不用去管这辆汽车是怎么做出来的,以及这个汽车里面的具体实现 2.Hibernate换数据库只需换方言和驱动就可以

优点:1.一个调用者想创建一个对象,只要知道其名称就可以了 2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以 3.屏蔽产品的具体实现,调用者只关心产品的接口

缺点每次增加一个产品时,都需要增加一个具体类和对象实现工厂,是的系统中类的个数成倍增加,在一定程度上增加了系统的复杂度,同时也增加了系统具体类的依赖。这并不是什么好事

工厂模式_第1张图片

  1. 简单工厂
     代码示例
    package com.bjsxt.dp.factory;
    
    public interface Moveable {
    	void run();
    }
    
     package com.bjsxt.dp.factory;
    
    
    public abstract class VehicleFactory {
    <span style="white-space:pre">	</span>abstract Moveable create();
    }
    package com.bjsxt.dp.factory;
    
    public class Plane implements Moveable {
    
    	@Override
    	public void run() {
    		System.out.println("扇着翅膀前进中plane....");
    	}
    
    }
    
    package com.bjsxt.dp.factory;
    
    public class PlaneFactory extends VehicleFactory{
    	public Moveable create() {
    		return new Plane();
    	}
    }
    
    package com.bjsxt.dp.factory;
    
    public class Test {
    	public static void main(String[] args) {
    		VehicleFactory factory = new PlaneFactory();
    		Moveable m = factory.create();
    		m.run();
    	}
    }
    

  2. 抽象工厂 

    一、概述

    1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式。例:小明装修屋子,把电视、冰箱都替换掉,他这次需要把电视、冰箱换成三星的,下次装修可能要换成海尔的。此时可设计抽象类Telveison及Fridge负责产生产品,抽象工厂AbstractFactory负责产生一系列产品

    PS:抽象工厂与普通工厂各自的优缺点:

    (1)普通工厂容易在产品维度进行扩展,但产生系列产品时不方便,且易造成工厂类泛滥

    (2)抽象工厂增加新产品时,要修改AbstractFactory等多处地方


  3. 代码示例
    package com.bjsxt.dp.factory.abstractfactory;
    
    public abstract class AbstractFactory {
    	public abstract Vehicle createVehicle();
    	public abstract Weapon createWeapon();
    	public abstract Food createFood();
    	
    }
    public abstract class Vehicle {
    	public abstract void run();
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public abstract class Weapon {
    	public abstract void shoot();
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public abstract class Food {
    	public abstract void printName();
    }

    package com.bjsxt.dp.factory.abstractfactory;
    
    public class AK47 extends Weapon{
    	public void shoot() {
    		System.out.println("пепепе...");
    	}
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public class Apple extends Food {
    	public void printName() {
    		System.out.println("apple");
    	}
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public class Broom  extends Vehicle{
    
    
    	public void run() {
    		System.out.println("broom4broom.....");
    	}
    
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    
    public class Car extends Vehicle {
    	
    	
    	public void run() {
    		System.out.println("冒着烟奔跑中car.......");
    	}
    }
    package com.bjsxt.dp.factory.abstractfactory;
    
    public class DefaultFactory extends AbstractFactory{
    
    	@Override
    	public Food createFood() {
    		// TODO Auto-generated method stub
    		return new Apple();
    	}
    
    	@Override
    	public Vehicle createVehicle() {
    		// TODO Auto-generated method stub
    		return new Car();
    	}
    
    	@Override
    	public Weapon createWeapon() {
    		// TODO Auto-generated method stub
    		return new AK47();
    	}
    	
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public class MagicFactory extends AbstractFactory {
    
    	@Override
    	public Food createFood() {
    		// TODO Auto-generated method stub
    		return new MushRoom();
    	}
    
    	@Override
    	public Vehicle createVehicle() {
    		// TODO Auto-generated method stub
    		return new Broom();
    	}
    
    	@Override
    	public Weapon createWeapon() {
    		// TODO Auto-generated method stub
    		return new MagicStick();
    	}
    	
    }
    

    package com.bjsxt.dp.factory.abstractfactory;
    
    public class Test {
    	public static void main(String[] args) {
    		//DefaultFactory f = new DefaultFactory();
    		//AbstractFactory f = new DefaultFactory();
    		AbstractFactory f = new MagicFactory();
    		Vehicle v = f.createVehicle(); 
    		v.run();
    		Weapon w = f.createWeapon();
    		w.shoot();
    		Food a = f.createFood();
    		a.printName();
    	}
    }
    

你可能感兴趣的:(工厂模式)