工厂模式简单理解
工厂模式
通俗理解
工厂模式简单来说,就是代替new关键字,分为三种基本工厂:简单工厂、工厂方法、抽象工厂。
使用场景
不想直接new对象,如果类改变,需要改代码,如果依赖该类的很多,那将是很痛苦的事情
简单工厂
最简单的对象创建管理方式,对不同的对象进行了一次封装,根据传递类型来执行需要创建的对象;将实现逻辑抽离出去,该类只做调用。使用场景:分类稳定的情况下是可以使用简单工厂的(calendar的源码中也用到了简单工厂),例如:
1、抽象产品类:
public interface IComputer {
//生产电脑
void method();
}
2、产品A实现类:
public class HuaWeiIComputer implements IComputer {
@Override
public void method() {
//生产华为电脑
}
}
3、产品B实现类:
public class AppleIComputer implements IComputer {
@Override
public void method() {
//生产苹果电脑
}
}
4、简单工厂(通过key判断,不太好,可是考虑试试反射):
public IComputer getService(String type) {
IComputer service = null;
if ("A".equals(type)) {
service = new HuaWeiIComputer();
}
if ("B".equals(type)) {
service = new AppleIComputer();
}
//生产电脑
service.method();
return service;
}
5、如果新增一个产品类型,则需要修改工厂方法,违反开闭原则,于是引出工厂方法模式。
6、如果采用反射来实现,则如下:
//工厂类
class Factory1{
public Object getAnimal(String className) throws Exception{
Class<?> cls = Class.forName(className);
Object obj = cls.newInstance();
return obj;
}
}
//测试类
public class ReflectFactory {
public static void main(String[] args) throws Exception{
Factory1 factory = new Factory1();
Animal an = (Animal)factory.getAnimal("com.qcjy.factory.Man1");
an.speak();
}
}
工厂方法
工厂方法模式会将每个产品都创建一个自己的工厂,然后再根据抽象工厂去实现每个派生类的工厂;
1、产品接口:
public interface Fruit {
void getFruitName();
}
2、产品抽象工厂:
public interface FruitFactory {
Fruit getFruit();
}
3、产品实现:
public class Apple implements Fruit {
@Override
public void getFruitName() {
System.out.println("苹果");
}
}
public class Orange implements Fruit {
@Override
public void getFruitName() {
System.out.println("橘子");
}
}
4、单独产品工厂:
public class AppleFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Apple();
}
}
public class OrangeFactory implements FruitFactory {
@Override
public Fruit getFruit() {
return new Orange();
}
}
5、测试
public class Client {
public static void main(String[] args) {
//使用工厂创建对象,而不需通过new实例对象:
Fruit fruit1 = new AppleFactory().getFruit();
Fruit fruit2 = new OrangeFactory().getFruit();
fruit1.getFruitName();
fruit2.getFruitName();
}
}
抽象工厂模式
抽象工厂主要实现的是一类产品,一种同类型的产品;通过在抽象工厂中增加创建产品的接口,并在具体子工厂中实现新加产品的创建;
抽象工厂模式是为了让创建工厂和一组产品与使用相分离,并可以随时切换到另一个工厂以及另一组产品;
抽象工厂模式实现的关键点是定义工厂接口和产品接口,但如何实现工厂与产品本身需要留给具体的子类实现,客户端只和抽象工厂与抽象产品打交道。

浙公网安备 33010602011771号